     1                                  ; ****************************************************************************
     2                                  ; tmodply2.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TMODPLY2.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 27/10/2017
     7                                  ;
     8                                  ; [ Last Modification: 27/12/2024 ]  !!! STEREO MOD PLAYING !!!
     9                                  ;
    10                                  ; Derived from 'tmodplay.s' (TMODPLAY.PRG, SB16) source code by Erdogan Tan
    11                                  ; (27/10/2017). ((Stereo mod playing with TRDOS 386 audio system calls...))
    12                                  ;
    13                                  ; <tmodplay.s> note:
    14                                  ;
    15                                  ; For 640x480x16 display, 'TNYPL211' source code ('EX1A.ASM' and 'EX1B.ASM'
    16                                  ; by Carlos Hasan, 1994) is modified in order to use previous ('modplay7.s')
    17                                  ; scope method as stereo. (Track/channel scope method -in TNYPL211 files- 
    18                                  ; is/was not applied because TRDOS 386 adaption of the tiny mod player uses 
    19                                  ; dma buffer for immediate -synchronized- displaying of sound waves.
    20                                  ; So, stereo wave display -two waves, two scopes- is normally applicable.)
    21                                  ;
    22                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    23                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    24                                  ;
    25                                  ; Stereophonic mod playing code prototype: 
    26                                  ;		'modplay6.s' (AC97) by Erdogan Tan (20/10/2017)
    27                                  ;
    28                                  ; Modified by using the source code of 'tinyply3.s' ('TINYPLY3.PRG') 
    29                                  ; by Erdogan Tan (07/10/2017)
    30                                  ;
    31                                  ; Modified from 'playwav3.s' (13/06/2017)
    32                                  ;
    33                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    34                                  ;			                     (23/06/2017)
    35                                  ;
    36                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    37                                  ;				      (04/03/2017) 
    38                                  ; Assembler: NASM 2.11
    39                                  ; ----------------------------------------------------------------------------
    40                                  ;	   nasm  tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG	
    41                                  ; ****************************************************************************
    42                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    43                                  ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    44                                  
    45                                  ; 01/03/2017
    46                                  ; 16/10/2016
    47                                  ; 29/04/2016
    48                                  ; TRDOS 386 system calls (temporary list!)
    49                                  _ver 	equ 0
    50                                  _exit 	equ 1
    51                                  _fork 	equ 2
    52                                  _read 	equ 3
    53                                  _write	equ 4
    54                                  _open	equ 5
    55                                  _close 	equ 6
    56                                  _wait 	equ 7
    57                                  _creat 	equ 8
    58                                  _link 	equ 9
    59                                  _unlink	equ 10
    60                                  _exec	equ 11
    61                                  _chdir	equ 12
    62                                  _time 	equ 13
    63                                  _mkdir 	equ 14
    64                                  _chmod	equ 15
    65                                  _chown	equ 16
    66                                  _break	equ 17
    67                                  _stat	equ 18
    68                                  _seek	equ 19
    69                                  _tell 	equ 20
    70                                  _mount	equ 21
    71                                  _umount	equ 22
    72                                  _setuid	equ 23
    73                                  _getuid	equ 24
    74                                  _stime	equ 25
    75                                  _quit	equ 26	
    76                                  _intr	equ 27
    77                                  _fstat	equ 28
    78                                  _emt 	equ 29
    79                                  _mdate 	equ 30
    80                                  _video 	equ 31
    81                                  _audio	equ 32
    82                                  _timer	equ 33
    83                                  _sleep	equ 34
    84                                  _msg    equ 35
    85                                  _geterr	equ 36
    86                                  _fpsave	equ 37
    87                                  _pri	equ 38
    88                                  _rele	equ 39
    89                                  _fff	equ 40
    90                                  _fnf	equ 41
    91                                  _alloc	equ 42
    92                                  _dalloc equ 43
    93                                  _calbac equ 44		
    94                                  
    95                                  %macro sys 1-4
    96                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    97                                      ; 03/09/2015	
    98                                      ; 13/04/2015
    99                                      ; Retro UNIX 386 v1 system call.	
   100                                      %if %0 >= 2   
   101                                          mov ebx, %2
   102                                          %if %0 >= 3    
   103                                              mov ecx, %3
   104                                              %if %0 = 4
   105                                                 mov edx, %4   
   106                                              %endif
   107                                          %endif
   108                                      %endif
   109                                      mov eax, %1
   110                                      ;int 30h
   111                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
   112                                  %endmacro
   113                                  
   114                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   115                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   116                                  
   117                                  ; 19/06/2017
   118                                  BUFFERSIZE equ 32768
   119                                  
   120                                  ; ----------------------------------------------------------------------------
   121                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   122                                  ;	July 14th, 1993.
   123                                  
   124                                  ;=============================================================================
   125                                  ;  
   126                                  ;=============================================================================
   127                                  
   128                                  [BITS 32]
   129                                  [org 0]
   130                                  
   131                                  Start:
   132                                  	; clear bss
   133 00000000 B9[00000900]            	mov	ecx, EOF
   134 00000005 BF[74550000]            	mov	edi, bss_start
   135 0000000A 29F9                    	sub	ecx, edi
   136 0000000C D1E9                    	shr	ecx, 1
   137 0000000E 31C0                    	xor	eax, eax
   138 00000010 F366AB                  	rep	stosw
   139                                  
   140                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   141 00000013 E830020000              	call    DetectICH
   142 00000018 731B                    	jnc     short GetFileName
   143                                  
   144                                  _dev_not_ready:
   145                                  ; couldn't find the audio device!
   146                                  	sys	_msg, noDevMsg, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000001A BB[55020000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000001F B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000024 BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000029 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 0000002E CD40                <1>  int 40h
   147 00000030 E9F2010000                      jmp     Exit
   148                                  
   149                                  GetFileName:
   150                                  	;cmp	ah, 1 ; SB16 Sound card
   151                                  	;jne	_dev_not_ready	
   152                                  	  
   153 00000035 89E6                    	mov	esi, esp
   154 00000037 AD                      	lodsd
   155 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   156                                  		; (program file name & mod file name)
   157 0000003B 0F82EF010000            	jb	pmsg_usage ; nothing to do
   158                                  
   159 00000041 AD                      	lodsd ; program file name address 
   160 00000042 AD                      	lodsd ; mod file name address (file to be read)
   161 00000043 89C6                    	mov	esi, eax
   162 00000045 BF[D4E20000]            	mov	edi, mod_file_name
   163                                  ScanName:       
   164 0000004A AC                      	lodsb
   165 0000004B 84C0                    	test	al, al
   166 0000004D 0F84DD010000            	je	pmsg_usage
   167 00000053 3C20                    	cmp	al, 20h
   168 00000055 74F3                    	je	short ScanName	; scan start of name.
   169 00000057 AA                      	stosb
   170 00000058 B4FF                    	mov	ah, 0FFh
   171                                  a_0:	
   172 0000005A FEC4                    	inc	ah
   173                                  a_1:
   174 0000005C AC                      	lodsb
   175 0000005D AA                      	stosb
   176 0000005E 3C2E                    	cmp	al, '.'
   177 00000060 74F8                    	je	short a_0	
   178 00000062 20C0                    	and	al, al
   179 00000064 75F6                    	jnz	short a_1
   180                                  
   181 00000066 08E4                    	or	ah, ah		 ; if period NOT found,
   182 00000068 750B                    	jnz	short PrintPMesg ; then add a .MOD extension.
   183                                  SetExt:
   184 0000006A 4F                      	dec	edi
   185 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   186 00000071 C6470400                	mov	byte [edi+4], 0
   187                                  PrintPMesg:      
   188                                  	; Prints the Credits Text.
   189                                  	sys	_msg, Credits, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000075 BB[53540000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000007A B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000007F BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000084 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000089 CD40                <1>  int 40h
   190                                  _1:
   191                                  	; 19/06/2017
   192                                  	; Allocate Audio Buffer (for user)
   193                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000008B BB00020000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000090 B900800000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000095 BA[00F00000]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000009A B820000000          <1>  mov eax, %1
   110                              <1> 
   111 0000009F CD40                <1>  int 40h
   194 000000A1 0F8205010000            	jc	error_exit
   195                                  _2:
   196                                  	;; Initialize Audio Device (bl = 1 -> Interrupt method)
   197                                  	;sys	_audio, 0301h, 0, sb16_int_handler 
   198                                  	;jc	error_exit
   199                                  	
   200                                  	; 20/10/2017
   201                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   202                                  	sys	_audio, 0300h, 1, srb 
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000A7 BB00030000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000000AC B901000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000000B1 BA[95550000]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000B6 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000000BB CD40                <1>  int 40h
   203 000000BD 0F82E9000000            	jc	error_exit
   204                                  
   205                                  LoadMod:  
   206 000000C3 BF[D4E20000]            	mov	edi, mod_file_name
   207 000000C8 E888020000              	call    LoadModule		; Load the MODule...
   208                                  	; 08/10/2017
   209 000000CD 731B                    	jnc	short _3		; any error loading?
   210                                  
   211                                  	; yes, print error and Exit.
   212                                  
   213                                  	sys	_msg, ErrorMesg, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000CF BB[87540000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000000D4 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000000D9 BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000DE B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000000E3 CD40                <1>  int 40h
   214 000000E5 E93D010000              	jmp     Exit
   215                                  _3:
   216                                  	; 10/06/2017
   217                                  	sys	_audio, 0E00h ; get audio controller info
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000EA BB000E0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000EF B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000000F4 CD40                <1>  int 40h
   218 000000F6 0F82B0000000            	jc	error_exit
   219                                  
   220                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   221                                  	;jne	_dev_not_ready	
   222                                  
   223                                  	; EAX = IRQ Number in AL
   224                                  	;	Audio Device Number in AH 
   225                                  	; EBX = DEV/VENDOR ID
   226                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   227                                  	; ECX = BUS/DEV/FN 
   228                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   229                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   230                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   231                                  	;      (Low word, DX = NAMBAR address)
   232                                  
   233 000000FC A2[94550000]            	mov	[ac97_int_ln_reg], al
   234 00000101 891D[84550000]          	mov	[dev_vendor], ebx
   235 00000107 890D[88550000]          	mov	[bus_dev_fn], ecx
   236 0000010D 668915[90550000]        	mov	[ac97_NamBar], dx
   237                                  	;mov	[ac97_NamBar], dx
   238                                  	;shr	dx, 16
   239                                  	;mov	[ac97_NabmBar], dx
   240 00000114 8915[90550000]          	mov	[ac97_NamBar], edx	
   241                                    
   242 0000011A E8F00A0000              	call	write_audio_dev_info 
   243                                  
   244                                  PlayNow: 
   245 0000011F E80A0A0000              	call    StartPlaying
   246                                  
   247                                          ; load 32768 bytes into audio buffer
   248 00000124 BF[00F00000]            	mov	edi, Audio_Buffer
   249                                  	; 19/10/2017
   250                                  	;mov	ebx, BUFFERSIZE
   251 00000129 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   252 0000012E E8A9080000              	call	GetSamples
   253 00000133 7277                    	jc	error_exit
   254                                  
   255                                  	; 27/12/2024
   256                                  	; bh = 16 : update (current, first) dma half buffer
   257                                  	; bl = 0  : then switch to the next (second) half buffer
   258                                  	sys	_audio, 1000h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000135 BB00100000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000013A B820000000          <1>  mov eax, %1
   110                              <1> 
   111 0000013F CD40                <1>  int 40h
   259                                  
   260                                  	; 27/12/2024
   261                                          ; load 32768 bytes into audio buffer
   262 00000141 BF[00F00000]            	mov	edi, Audio_Buffer
   263 00000146 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   264 0000014B E88C080000              	call	GetSamples
   265                                  	;jc	error_exit
   266                                  
   267                                  ;	;mov	ecx, 128	; Make a lookup table
   268                                  ;	mov	cl, 128
   269                                  ;	xor     ebx, ebx	; for fastest pixel
   270                                  ;	mov     edx, 320*(100-64)	; addressing.
   271                                  ;MakeOfs:        
   272                                  ;	mov     [RowOfs+ebx], dx
   273                                  ;	mov     [RowOfs+ebx+2], dx
   274                                  ;	add     dx, 320
   275                                  ;	add     ebx, 4
   276                                  ;	loop    MakeOfs
   277                                  
   278                                  	; 27/12/2024
   279 00000150 B900010000              	mov	ecx, 256
   280                                  	; 27/10/2017
   281                                  	;mov	cx, 256
   282 00000155 31DB                    	xor	ebx, ebx
   283 00000157 BF[D0D80000]            	mov	edi, RowOfs
   284                                  MakeOfs:
   285                                  	; 29/10/2017
   286                                  	;mov	ax, 128
   287                                  	;mul	bx
   288                                  	;mov	al, ah
   289                                  	;mov	ah, 80
   290                                  	;mul	ah
   291 0000015C 89D8                    	mov	eax, ebx
   292 0000015E 66C1E007                	shl	ax, 7 ; * 128
   293 00000162 B050                    	mov	al, 80
   294 00000164 F6E4                    	mul	ah
   295 00000166 66AB                    	stosw
   296 00000168 43                      	inc	ebx
   297 00000169 E2F1                    	loop	MakeOfs
   298                                  	
   299                                  	; 23/06/2017
   300                                  	; Map DMA buffer to user's memory space
   301                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000016B BB000D0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000170 B900000100          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000175 BA[00000200]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000017A B820000000          <1>  mov eax, %1
   110                              <1> 
   111 0000017F CD40                <1>  int 40h
   302                                  	;jc	error_exit
   303                                  
   304                                  	; 24/06/2017
   305                                  	; Set Master Volume Level (BL=0 or 80h)
   306                                  	; 	 	for next playing (BL>=80h)
   307                                  	sys	_audio, 0B80h, 1D1Dh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000181 BB800B0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000186 B91D1D0000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000018B B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000190 CD40                <1>  int 40h
   308                                  
   309                                  	; 20/10/2017
   310 00000192 C605[25E30000]1D        	mov	byte [volume_level], 1Dh
   311                                  
   312                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   313                                  	
   314                                  	; 27/12/2024
   315                                  	; Start	to play
   316                                  	;mov	al, [bps]
   317                                  	;shr	al, 4 ; 8 -> 0, 16 -> 1
   318                                  	;shl	al, 1 ; 16 -> 2, 8 -> 0
   319                                  	;mov	bl, [stmo]
   320                                  	;dec	bl
   321                                  	;or	bl, al
   322                                  	;mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz
   323                                  	;mov	bh, 4 ; start to play
   324                                  	;sys	_audio
   325                                      
   326                                  	;; SETUP SIGNAL RESPONSE BYTE
   327                                  	;; 06/03/2017
   328                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   329                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   330                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   331                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   332                                  	;sys	_calbac
   333                                  	;jc	short error_exit
   334                                  
   335                                  	; DIRECT VGA MEMORY ACCESS
   336                                  	; bl = 0, bh = 5
   337                                  	; Direct access/map to VGA memory (0A0000h)
   338                                  
   339                                  	sys	_video, 0500h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000199 BB00050000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000019E B81F000000          <1>  mov eax, %1
   110                              <1> 
   111 000001A3 CD40                <1>  int 40h
   340 000001A5 3D00000A00              	cmp	eax, 0A0000h
   341 000001AA 7418                    	je	short _a3
   342                                  error_exit:
   343                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001AC BB[A4540000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000001B1 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000001B6 BA0E000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001BB B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000001C0 CD40                <1>  int 40h
   344 000001C2 EB63                    	jmp	short Exit
   345                                  
   346                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   347                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   348                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   349                                  ;       second, or the module will sound "looped".
   350                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   351                                  ;       the polling is called from my routine, and then the irq 0 must be
   352                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   353                                  ;       samples played by the Sound Blaster. Note that some samples are
   354                                  ;       discarded in the next code, just for fun!
   355                                  
   356                                  _a3:
   357                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   358                                  	;int     31h
   359                                  
   360                                  	; 21/10/2017
   361                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   362                                  	;int	31h
   363                                  
   364                                  	; 22/10/2017
   365 000001C4 E8060C0000              	call	setgraphmode	; Set video mode to 640*480x16
   366                                  
   367                                  	; 22/10/2017
   368                                  	;call	loadlbm
   369                                  	;jc	short loadlbm_err
   370                                  
   371 000001C9 BE[FC0F0000]            	mov	esi, LOGO_ADDRESS
   372 000001CE E8EE0C0000              	call	putlbm
   373                                  	;jnc	short loadlbm_ok
   374 000001D3 731F                    	jnc	short _a4 ; 
   375                                  
   376                                  	;mov	byte [error_color], 0Eh ; Yellow
   377                                  
   378                                  loadlbm_err:
   379                                  	; 21/10/2017
   380                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   381                                  	;int	31h
   382                                  	; 22/10/2017
   383 000001D5 E8120C0000              	call	settextmode
   384                                  
   385                                  	sys	_msg, LOGO_ERROR_MSG, 255, [error_color]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001DA BB[CF0F0000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000001DF B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000001E4 8B15[F3010000]      <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001EA B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000001EF CD40                <1>  int 40h
   386 000001F1 EB34                    	jmp	short Exit
   387                                  
   388                                  	; 21/10/2017
   389                                  error_color:
   390 000001F3 0C                      	db	0Ch  ; Light Red
   391                                  	
   392                                  loadlbm_ok: 
   393                                  	; 21/10/2017
   394                                  _a4:
   395                                  	; 27/12/2024
   396                                  	; Start	to play
   397 000001F4 A0[CA540000]            	mov	al, [bps]
   398 000001F9 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   399 000001FC D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   400 000001FE 8A1D[C9540000]          	mov	bl, [stmo]
   401 00000204 FECB                    	dec	bl
   402 00000206 08C3                    	or	bl, al
   403 00000208 668B0D[CB540000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz
   404 0000020F B704                    	mov	bh, 4 ; start to play
   405                                  	sys	_audio
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101                              <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000211 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000216 CD40                <1>  int 40h
   406                                  
   407                                  	; 24/06/2017
   408 00000218 E863000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   409                                  
   410                                  _s_exit:
   411 0000021D E8BC090000              	call	StopPlaying	; STOP!
   412                                  	
   413                                  	; 22/10/2017
   414                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   415                                  	;int	31h
   416 00000222 E8C50B0000              	call	settextmode
   417                                  Exit:           
   418                                  	;call	FreeModule	; Free MODule core.
   419                                  	
   420                                  	sys 	_exit	; Bye !
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101                              <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000227 B801000000          <1>  mov eax, %1
   110                              <1> 
   111 0000022C CD40                <1>  int 40h
   421                                  here:
   422 0000022E EBFE                    	jmp	short here
   423                                  
   424                                  pmsg_usage:
   425                                  	sys	_msg, msg_usage, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000230 BB[DD530000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000235 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000023A BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000023F B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000244 CD40                <1>  int 40h
   426 00000246 EBDF                    	jmp	short Exit
   427                                  
   428                                  DetectICH:
   429                                  	; 24/06/2017
   430                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   431                                          sys	_audio, 0102h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000248 BB02010000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000024D B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000252 CD40                <1>  int 40h
   432 00000254 C3                      	retn
   433                                  
   434                                  noDevMsg:
   435 00000255 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   435 0000025E 61626C6520746F2066-
   435 00000267 696E64204143393720-
   435 00000270 617564696F20646576-
   435 00000279 696365210D0A00     
   436                                  
   437                                  ;ac97_int_handler:
   438                                  ;	; 19/06/2017
   439                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   440                                  ;
   441                                  ;	sys	_rele ; return from callback service 
   442                                  ;	; we must not come here !
   443                                  ;	sys	_exit
   444                                  
   445                                  ;=============================================================================
   446                                  ;      
   447                                  ;=============================================================================
   448                                  
   449                                  	; 27/12/2024
   450                                  PlayMod:
   451                                  	; 27/10/2017
   452                                  	; 19/10/2017
   453                                  	; 23/06/2017   
   454                                  	; 21/06/2017
   455                                  	; 19/06/2017
   456                                  
   457                                  	; 05/03/2017 (TRDOS 386)
   458                                  	; 14/02/2017
   459                                  	; 13/02/2017
   460                                  	; 08/12/2016
   461                                  	; 28/11/2016
   462                                  
   463 00000280 EB10                         	jmp	short modp_gs ; 23/06/2017
   464                                  p_loop:
   465 00000282 803D[95550000]00        	cmp	byte [srb], 0
   466 00000289 761C                    	jna	short q_loop
   467 0000028B C605[95550000]00        	mov	byte [srb], 0
   468                                  modp_gs:
   469 00000292 BF[00F00000]            	mov	edi, Audio_Buffer
   470                                  	; 19/10/2017
   471                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   472 00000297 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   473 0000029C E83B070000              	call	GetSamples
   474 000002A1 0F8205FFFFFF            	jc	error_exit
   475                                  q_loop:
   476 000002A7 B401                    	mov     ah, 1		; any key pressed?
   477 000002A9 CD32                    	int     32h		; no, Loop.
   478 000002AB 745C                    	jz	short r_loop
   479                                  
   480 000002AD B400                    	mov     ah, 0		; flush key buffer...
   481 000002AF CD32                    	int     32h
   482                                  
   483                                  	; 19/10/2017 (modplay6.s)
   484 000002B1 3C20                    	cmp	al, 20h
   485 000002B3 740E                    	je	short change_pan
   486                                  	; 09/10/2017 (playmod5.s)
   487 000002B5 3C2B                    	cmp	al, '+' ; increase sound volume
   488 000002B7 741D                    	je	short inc_volume_level
   489 000002B9 3C2D                    	cmp	al, '-'
   490 000002BB 743C                    	je	short dec_volume_level
   491                                  
   492                                  	; 19/10/2017 (modplay6.s)
   493 000002BD 24DF                    	and	al, 0DFh
   494 000002BF 3C50                    	cmp	al, 'P'
   495 000002C1 7545                    	jne	short q_return
   496                                  
   497                                  change_pan:
   498                                  	; 19/10/2017 (modplay6.s)
   499 000002C3 8A0D[24E30000]          	mov	cl, [pan_shift]
   500 000002C9 FEC1                    	inc	cl
   501 000002CB 80E103                  	and	cl, 3
   502 000002CE 880D[24E30000]          	mov	[pan_shift], cl
   503 000002D4 EB33                    	jmp	short r_loop
   504                                  
   505                                  	; 09/10/2017 (playmod5.s)
   506                                  	; 24/06/2017 (wavplay2.s)
   507                                  inc_volume_level:
   508 000002D6 8A0D[25E30000]          	mov	cl, [volume_level]
   509 000002DC 80F91F                  	cmp	cl, 1Fh ; 31
   510 000002DF 7328                    	jnb	short r_loop
   511 000002E1 FEC1                    	inc	cl
   512                                  change_volume_level:
   513 000002E3 880D[25E30000]          	mov	[volume_level], cl
   514 000002E9 88CD                    	mov	ch, cl
   515                                  	; Set Master Volume Level
   516                                  	sys	_audio, 0B00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000002EB BB000B0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000002F0 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000002F5 CD40                <1>  int 40h
   517 000002F7 EB10                    	jmp	short r_loop
   518                                  dec_volume_level:
   519 000002F9 8A0D[25E30000]          	mov	cl, [volume_level]
   520 000002FF 80F901                  	cmp	cl, 1 ; 1
   521 00000302 7605                    	jna	short r_loop
   522 00000304 FEC9                    	dec	cl
   523 00000306 EBDB                    	jmp	short change_volume_level
   524                                  
   525                                  q_return:
   526 00000308 C3                      	retn
   527                                  r_loop:
   528                                  	;;;
   529                                  	; 27/12/2024
   530                                  	sys	_time, 4 ; get timer ticks (18.2 ticks/second)
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000309 BB04000000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000030E B80D000000          <1>  mov eax, %1
   110                              <1> 
   111 00000313 CD40                <1>  int 40h
   531 00000315 3B05[D0E20000]          	cmp	eax, [timerticks]
   532 0000031B 0F8461FFFFFF            	je	p_loop
   533 00000321 A3[D0E20000]            	mov	[timerticks], eax
   534                                  	;;;
   535                                  
   536                                  	; 27/10/2017
   537                                  	; Get Current DMA buffer Pointer 
   538                                  	; 23/06/2017 ('modplay6.s')
   539                                  	; bh = 15, get current pointer (DMA buffer offset)
   540                                  	; bl = 0, for PCM OUT
   541                                  	; ecx = 0
   542                                  	;
   543                                  	sys	_audio, 0F00h, 0
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000326 BB000F0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000032B B900000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000330 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000335 CD40                <1>  int 40h
   544                                  
   545                                  	; 28/10/2017
   546 00000337 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   547                                  	; 23/06/2017
   548 00000339 BE[00000200]            	mov     esi, DMA_Buffer
   549 0000033E 01C6                    	add     esi, eax	; add offset value
   550                                  	; 24/06/2017
   551 00000340 B9[00FC0200]            	mov	ecx, DMA_Buffer + (65536 - (256*4))
   552 00000345 39CE                    	cmp	esi, ecx 
   553 00000347 7602                    	jna	short _4
   554 00000349 89CE                    	mov	esi, ecx
   555                                  _4:
   556                                  	; 23/10/2017 ('tmodplay.s')
   557 0000034B E8A30A0000              	call	drawscopes
   558                                  
   559 00000350 E92DFFFFFF              	jmp	p_loop
   560                                  
   561                                  ;=============================================================================
   562                                  ;               MODLOAD.ASM
   563                                  ;=============================================================================
   564                                  
   565                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   566                                  ;	July 10th, 1993.
   567                                  
   568                                  ; STRUCTURES
   569                                  
   570                                  struc ModSample
   571 00000000 <res 16h>               .msName:	resb 22
   572 00000016 ????                    .msLength:	resw 1
   573 00000018 ??                      .msFinetune:	resb 1
   574 00000019 ??                      .msVolume:	resb 1
   575 0000001A ????                    .msRepeat:	resw 1
   576 0000001C ????                    .msRepLen:	resw 1
   577                                  .size:		; 30 bytes
   578                                  endstruc
   579                                  
   580                                  struc ModHeader
   581 00000000 <res 14h>               .mhName:	resb 20
   582 00000014 <res 3A2h>              .mhSamples:	resb ModSample.size*31
   583 000003B6 ??                      .mhOrderLen:	resb 1
   584 000003B7 ??                      .mhReStart:	resb 1
   585 000003B8 <res 80h>               .mhOrder:	resb 128
   586 00000438 ????????                .mhSign:	resw 2
   587                                  .size:		; 1084 bytes
   588                                  endstruc
   589                                  
   590                                  struc ModInfoRec
   591 00000000 ??                      .OrderLen:	resb 1
   592 00000001 ??                      .ReStart:	resb 1
   593 00000002 <res 80h>               .Order:		resb 128
   594 00000082 ????????                .Patterns:	resd 1
   595 00000086 <res 3Eh>               .SampOfs:	resw 31
   596 000000C4 <res 3Eh>               .SampSeg:	resw 31
   597 00000102 <res 3Eh>               .SampLen:	resw 31
   598 00000140 <res 3Eh>               .SampRep:	resw 31
   599 0000017E <res 3Eh>               .SampRepLen:	resw 31
   600 000001BC <res 3Eh>               .SampVol:	resw 31
   601                                  .size:		; 506 bytes	
   602                                  endstruc
   603                                  
   604                                  ; CODE
   605                                  
   606                                  ; modplay5.s
   607                                  ; 07/10/2017
   608                                  ; tinyply3.s
   609                                  ; 06/10/2017
   610                                  ; 04/10/2017
   611                                  ; /* MOD FileFormat */
   612                                  
   613                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   614                                  ID_FLT4 equ 34544C46h ; "FLT4"
   615                                  ID_8CHN equ 4E484338h ; "8CHN"
   616                                  ID_FLT8 equ 34544C46h ; "FLT8"
   617                                  
   618                                  ; CODE
   619                                  
   620                                  LoadModule:
   621                                  	; edi = file name address
   622                                  
   623 00000355 60                      	pushad
   624                                  
   625 00000356 E878010000              	call    ClearModInfo
   626                                  OpenFile:       
   627                                  	; ebx = ASCIIZ file name address
   628                                  	; ecx = open mode (0 = open for read)	
   629                                  	sys	_open, edi, 0 ; open for reading
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000035B 89FB                <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000035D B900000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000362 B805000000          <1>  mov eax, %1
   110                              <1> 
   111 00000367 CD40                <1>  int 40h
   630 00000369 0F8262010000            	jc	Failed
   631 0000036F A3[96550000]            	mov     [FileHandle], eax
   632                                  ReadHeader:
   633                                  	; ebx = File handle
   634                                  	; ecx = Buffer address
   635                                  	; edx = Byte count
   636                                  	sys	_read, [FileHandle], Header, ModHeader.size
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000374 8B1D[96550000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000037A B9[9A550000]        <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000037F BA3C040000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000384 B803000000          <1>  mov eax, %1
   110                              <1> 
   111 00000389 CD40                <1>  int 40h
   637 0000038B 0F8231010000            	jc      CloseFile
   638                                  CheckMK:  
   639                                  	; 04/10/2017
   640 00000391 A1[D2590000]            	mov	eax, [Header+ModHeader.mhSign]
   641                                        
   642 00000396 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   643                                  	;je	short Is4chnMod
   644 0000039B 742B                    	je	short IsModFile
   645                                  CheckFLT4:
   646 0000039D 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   647                                  	;je	short Is4chnMod
   648 000003A2 7424                    	je	short IsModFile
   649                                  Check8CHN:
   650 000003A4 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   651 000003A9 740D                    	je	short Is8chnMod
   652                                  CheckFLT8:
   653 000003AB 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   654                                  	; 06/10/2017
   655 000003B0 7406                    	je	short Is8chnMod
   656 000003B2 F9                      	stc
   657 000003B3 E90A010000              	jmp	CloseFile
   658                                  Is8chnMod:
   659 000003B8 C605[C5540000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   660 000003BF C605[C4540000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   661 000003C6 EB00                    	jmp	short IsModFile
   662                                  ;Is4chnMod:
   663                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   664                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   665                                  
   666                                  IsModFile:
   667 000003C8 A0[50590000]            	mov     al, [Header+ModHeader.mhOrderLen]
   668 000003CD A2[D6590000]            	mov     [ModInfo.OrderLen], al
   669                                  
   670 000003D2 A0[51590000]            	mov     al, [Header+ModHeader.mhReStart]
   671 000003D7 3A05[50590000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   672 000003DD 7202                    	jb      short SetReStart
   673 000003DF B07F                    	mov     al, 7Fh
   674                                  SetReStart:
   675 000003E1 A2[D7590000]            	mov     [ModInfo.ReStart], al
   676                                  
   677                                  	;mov	ecx, 128
   678 000003E6 66B98000                	mov	cx, 128
   679 000003EA 31D2                    	xor     edx, edx
   680 000003EC 31DB                    	xor     ebx, ebx
   681                                  CopyOrder:
   682 000003EE 8AB3[52590000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   683 000003F4 88B3[D8590000]          	mov     [ModInfo.Order+ebx], dh
   684 000003FA 38D6                    	cmp     dh, dl
   685 000003FC 7202                    	jb      short NextOrder
   686 000003FE 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   687                                  NextOrder:
   688 00000400 43                      	inc     ebx
   689 00000401 E2EB                    	loop    CopyOrder
   690                                  AllocPatterns:  
   691 00000403 81E2FF000000            	and	edx, 0FFh
   692                                  	; 04/10/2017
   693                                  	;inx	dx  ; 12/03/2017
   694 00000409 FEC2                    	inc	dl
   695                                  	; dl = number of patterns (04/07/2017)
   696 0000040B 8A0D[C4540000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   697 00000411 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   698                                  		     	     ; *2048 ; (byte count of patterns *64*8*4)
   699                                  	;
   700 00000413 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   701                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   702 00000415 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   703                                  	;
   704 0000041A 890D[585A0000]          	mov	[ModInfo.Patterns], ecx
   705                                  	;
   706 00000420 01CD                    	add	ebp, ecx ; next offset for samples
   707                                  ReadPatterns:  
   708                                  	;mov	ebx, [FileHandle] 
   709                                  	; ebx = File handle
   710                                  	; ecx = Buffer address
   711                                  	; edx = Byte count
   712                                  	sys	_read, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000422 8B1D[96550000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000428 B803000000          <1>  mov eax, %1
   110                              <1> 
   111 0000042D CD40                <1>  int 40h
   713 0000042F 0F828D000000            	jc      CloseFile
   714                                  
   715                                  	; patterns have been loaded here... (04/07/2017)
   716                                  
   717 00000435 BE[AE550000]            	mov	esi, Header+ModHeader.mhSamples
   718 0000043A 31FF                    	xor     edi, edi
   719                                  CopySamples:
   720 0000043C 668B4616                	mov     ax, [esi+ModSample.msLength]
   721 00000440 86E0                    	xchg    al, ah
   722 00000442 66D1E0                  	shl     ax, 1
   723 00000445 668987[D85A0000]        	mov     [ModInfo.SampLen+edi], ax
   724 0000044C 8A4619                  	mov     al, [esi+ModSample.msVolume]
   725 0000044F 30E4                    	xor     ah, ah
   726 00000451 668987[925B0000]        	mov     [ModInfo.SampVol+edi], ax
   727 00000458 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   728 0000045C 86E0                    	xchg    al, ah
   729 0000045E 66D1E0                  	shl     ax, 1
   730 00000461 668987[165B0000]        	mov     [ModInfo.SampRep+edi], ax
   731 00000468 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   732 0000046C 86E0                    	xchg    al, ah
   733 0000046E 66D1E0                  	shl     ax, 1
   734 00000471 668987[545B0000]        	mov     [ModInfo.SampRepLen+edi], ax
   735 00000478 83C61E                  	add     esi, ModSample.size
   736 0000047B 6683C702                	add     di, 2
   737 0000047F 6683FF3E                	cmp     di, 2*31
   738 00000483 72B7                    	jb      short CopySamples
   739                                  
   740 00000485 31F6                    	xor     esi, esi
   741                                  AllocSamples:
   742 00000487 0FB796[D85A0000]        	movzx	edx, word [ModInfo.SampLen+esi]
   743                                  	; 07/10/2017
   744                                  	;shr	dx, 4 ; ***
   745 0000048E 21D2                    	and	edx, edx
   746 00000490 7426                    	jz      short NextSample
   747                                  	;inc	dx  ; number of paragraphs ; ***
   748                                  	;shl	dx, 4 ; ***
   749 00000492 89E8                    	mov	eax, ebp
   750 00000494 668986[5C5A0000]        	mov	[ModInfo.SampOfs+esi], ax
   751 0000049B C1E810                  	shr	eax, 16
   752 0000049E 668986[9A5A0000]        	mov	[ModInfo.SampSeg+esi], ax
   753 000004A5 89E9                    	mov	ecx, ebp
   754 000004A7 01D5                    	add	ebp, edx ; next offset for sample 
   755                                  ReadSample:
   756                                  	;mov	ebx, [FileHandle]
   757                                  	;movzx  edx, [ModInfo.SampLen+esi]
   758                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   759                                  
   760                                  	; ebx = File handle
   761                                  	; ecx = Buffer address
   762                                  	; edx = Byte count
   763                                  	sys	_read, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000004A9 8B1D[96550000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000004AF B803000000          <1>  mov eax, %1
   110                              <1> 
   111 000004B4 CD40                <1>  int 40h
   764 000004B6 720A                    	jc      short CloseFile
   765                                  
   766                                  NextSample:
   767 000004B8 6683C602                	add     si, 2
   768 000004BC 6683FE3E                	cmp     si, 2*31
   769 000004C0 72C5                    	jb      short AllocSamples
   770                                  CloseFile:      
   771 000004C2 9C                      	pushf
   772                                  	sys	_close, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000004C3 8B1D[96550000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000004C9 B806000000          <1>  mov eax, %1
   110                              <1> 
   111 000004CE CD40                <1>  int 40h
   773 000004D0 9D                      	popf
   774                                  Failed:       
   775 000004D1 61                      	popad
   776 000004D2 C3                      	retn
   777                                  
   778                                  FreeModule:
   779                                  	; Erdogan Tan (13/02/2017)
   780                                  	; nothing to do here for memory de-allocation
   781                                  ClearModInfo:
   782 000004D3 57                      	push	edi
   783 000004D4 BF[D6590000]            	mov	edi, ModInfo
   784 000004D9 B9FA010000              	mov     ecx, ModInfoRec.size
   785                                  	;cld
   786 000004DE 30C0                    	xor     al, al
   787 000004E0 F3AA                    	rep     stosb
   788 000004E2 5F                      	pop	edi
   789 000004E3 C3                      	retn
   790                                  
   791                                  ;=============================================================================
   792                                  ;               MODPLAY.ASM
   793                                  ;=============================================================================
   794                                  
   795                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   796                                  ;	July 23th, 1993.
   797                                  
   798                                  ; EQUATES
   799                                  
   800                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   801                                  DefTempo        equ 6
   802                                  DefBpm          equ 125
   803                                  MidCRate        equ 8448
   804                                  MixBufSize	equ 4096
   805                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   806                                  
   807                                  ; STRUCTURES
   808                                  
   809                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   810 00000000 ????????                .Samples:	resd 1
   811                                  ;.Position:	resw 1
   812 00000004 ????????                .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   813 00000008 ????                    .Len:		resw 1
   814 0000000A ????                    .Repeat:	resw 1
   815 0000000C ????                    .RepLen:	resw 1
   816 0000000E ??                      .Volume: 	resb 1 ; Volume
   817 0000000F ??                      .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   818                                  ;.Error:	resb 1
   819                                  ;.Reserved:	resb 1 ; 01/10/2017
   820 00000010 ????                    .Period:	resw 1 ; Period
   821 00000012 ????                    .Pitch:		resw 1 
   822 00000014 ????                    .Effect:	resw 1 ; Effect
   823 00000016 ????                    .PortTo:	resw 1 ; Toneporta wanted period
   824 00000018 ??                      .PortParm:	resb 1 ; Toneporta speed
   825 00000019 ??                      .VibPos:	resb 1 ; Vibrato wave position 
   826 0000001A ??                      .VibParm:	resb 1 ; Vibrato depth/rate
   827 0000001B ??                      .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   828 0000001C ??                      .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   829                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   830 0000001D ??                      .Error:		resb 1 ; 01/10/2017
   831 0000001E ????????????            .Arp:		resw 3
   832 00000024 ????                    .ArpIndex:	resw 1
   833                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   834                                  endstruc
   835                                  
   836                                  ; CODE
   837                                  
   838                                  ;--------------------------------------------------------------------------
   839                                  ; updatechannel - update the track using the current effect
   840                                  ;--------------------------------------------------------------------------
   841                                  ; 
   842                                  ;--------------------------------------------------------------------------
   843                                  ; 	Track:  Process the next 	 in one track.
   844                                  ;  In:
   845                                  ;    ds:di -  Track info Address.
   846                                  ;--------------------------------------------------------------------------
   847                                  
   848                                  ; edi = Track info address
   849                                  
   850                                  updatechannel:
   851                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   852                                  
   853 000004E4 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   854                                  
   855                                  	;test   dx, dx
   856                                  	;je     short None
   857                                  	;cmp    dh, 00h
   858                                  	;je     short Arpeggio
   859                                  	;cmp    dh, 01h
   860                                  	;je     short PortUp
   861                                  	;cmp    dh, 02h
   862                                  	;je     short PortDown
   863                                  	;cmp    dh, 03h
   864                                  	;je     TonePort
   865                                  	;cmp    dh, 04h
   866                                  	;je     Vibrato
   867                                  	;cmp    dh, 05h
   868                                  	;je     PortSlide
   869                                  	;cmp    dh, 06h
   870                                  	;je     VibSlide
   871                                  	;cmp    dh, 0Ah
   872                                  	;je     VolSlide
   873                                  	;retn
   874                                  
   875 000004E8 0FB6C6                  	movzx	eax, dh
   876 000004EB 240F                    	and	al, 0Fh
   877 000004ED FF2485[D4520000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   878                                  efxnull:
   879                                  None:           
   880 000004F4 C3                      	retn
   881                                  efxarpeggio2:
   882                                  	; 01/10/2017
   883 000004F5 84D2                    	test    dl, dl
   884 000004F7 74FB                    	jz      short efxnull
   885                                  Arpeggio:
   886 000004F9 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   887 000004FD 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   888 00000502 66894712                	mov     [edi+TrackInfo.Pitch], ax
   889 00000506 6683C302                	add     bx, 2
   890 0000050A 6683FB06                	cmp     bx, 6
   891 0000050E 7202                    	jb      short SetArpIndex
   892 00000510 31DB                    	xor     ebx, ebx
   893                                  SetArpIndex:
   894 00000512 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   895 00000516 C3                      	retn
   896                                  efxportaup:
   897                                  PortUp:
   898 00000517 30F6                    	xor     dh, dh
   899                                  	;mov	bx, [edi+TrackInfo.Period]
   900 00000519 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   901 0000051D 6629D3                  	sub     bx, dx
   902                                  	;cmp	bx, 113
   903 00000520 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   904 00000524 7D04                    	jge     short NotSmall
   905                                  	;mov	bx, 113
   906 00000526 66BB1C00                	mov	bx, 28 ; 01/10/2017
   907                                  NotSmall:
   908 0000052A 66895F10                	mov     [edi+TrackInfo.Period], bx
   909 0000052E 6601DB                  	add     bx, bx
   910                                  	;mov	ax, [PitchTable+bx]
   911 00000531 668B83[D05B0000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   912 00000538 66894712                	mov     [edi+TrackInfo.Pitch], ax
   913 0000053C C3                      	retn
   914                                  efxportadown:
   915                                  PortDown:
   916 0000053D 30F6                    	xor     dh, dh
   917                                  	;mov	bx, [edi+TrackInfo.Period]
   918 0000053F 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   919 00000543 6601D3                  	add     bx, dx
   920 00000546 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   921                                  	;cmp	bx, 856
   922 0000054B 7E04                    	jle     short NotBig
   923                                  	;mov	bx, 856
   924 0000054D 66BB600D                	mov	bx, 3424 ; 01/10/2017
   925                                  NotBig:         
   926 00000551 66895F10                	mov     [edi+TrackInfo.Period], bx
   927 00000555 6601DB                  	add     bx, bx
   928                                  	;mov	ax, [PitchTable+bx]
   929 00000558 668B83[D05B0000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   930 0000055F 66894712                	mov     [edi+TrackInfo.Pitch], ax
   931 00000563 C3                      	retn
   932                                  efxtoneporta2:
   933                                  TonePort:
   934 00000564 30F6                    	xor     dh, dh
   935 00000566 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   936                                  	;mov	bx, [edi+TrackInfo.Period]
   937 0000056A 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   938 0000056E 6639C3                  	cmp     bx, ax
   939 00000571 7429                    	je      short NoPort
   940 00000573 7F0D                    	jg      short PortToUp
   941                                  PortToDown:     
   942 00000575 6601D3                  	add     bx, dx
   943 00000578 6639C3                  	cmp     bx, ax
   944 0000057B 7E0D                    	jle     short SetPort
   945                                  FixPort:        
   946 0000057D 6689C3                  	mov     bx, ax
   947 00000580 EB08                    	jmp     short SetPort
   948                                  PortToUp:
   949 00000582 6629D3                  	sub     bx, dx
   950 00000585 6639C3                  	cmp     bx, ax
   951 00000588 7CF3                    	jl      short FixPort
   952                                  SetPort:        
   953 0000058A 66895F10                	mov     [edi+TrackInfo.Period], bx
   954 0000058E 6601DB                  	add     bx, bx
   955                                  	;mov	ax, [PitchTable+bx]
   956 00000591 668B83[D05B0000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   957 00000598 66894712                	mov     [edi+TrackInfo.Pitch], ax
   958                                  NoPort:         
   959 0000059C C3                      	retn
   960                                  efxvibrato2:
   961                                  	; 01/10/2017
   962                                  Vibrato:
   963 0000059D 88D6                    	mov     dh, dl
   964                                  	;and	dl, 0Fh
   965                                  	;shr	dh, 4
   966                                  	;shl	dh, 2
   967 0000059F 6681E20FF0              	and     dx, 0F00Fh
   968 000005A4 C0EE02                  	shr     dh, 2
   969                                  	;add	[edi+TrackInfo.VibPos], dh
   970                                  	;mov	dh, [edi+TrackInfo.VibPos]
   971                                  	;mov	bl, dh
   972 000005A7 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   973 000005AA 007719                  	add	[edi+TrackInfo.VibPos], dh
   974 000005AD 88DE                    	mov	dh, bl ; 01/10/2017
   975 000005AF C0EB02                  	shr     bl, 2
   976                                  	;and	bx, 1Fh
   977                                  	;mov	al, [SinTable+bx]
   978 000005B2 83E31F                  	and	ebx, 1Fh
   979 000005B5 8A83[BC530000]          	mov	al, [SinTable+ebx]
   980 000005BB F6E2                    	mul     dl
   981                                  	;rol	ax, 1
   982                                  	;xchg	al, ah
   983                                  	;and	ah, 1
   984 000005BD 66C1E807                	shr	ax, 7
   985 000005C1 84F6                    	test    dh, dh
   986 000005C3 7903                    	jns     short VibUp
   987 000005C5 66F7D8                  	neg     ax
   988                                  VibUp:          
   989 000005C8 66034710                	add     ax, [edi+TrackInfo.Period]
   990 000005CC 6689C3                  	mov	bx, ax
   991                                  	;movzx	ebx, ax
   992 000005CF 6683FB71                	cmp     bx, 113
   993                                  	;cmp	bx, 113
   994 000005D3 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   995 000005D7 7D06                    	jge     short NoLoVib
   996                                  	;mov	bx, 113
   997 000005D9 66BB1C00                	mov	bx, 28	; 01/10/2017
   998 000005DD EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   999                                  NoLoVib:        
  1000 000005DF 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
  1001                                  	;cmp	bx, 856
  1002 000005E4 7E04                    	jle     short NoHiVib
  1003                                  	;mov	bx, 856
  1004 000005E6 66BB600D                	mov	bx, 3424 ; 01/10/2017
  1005                                  NoHiVib:        
  1006 000005EA 6601DB                  	add     bx, bx
  1007                                  	;mov	ax, [PitchTable+bx]
  1008 000005ED 668B83[D05B0000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1009 000005F4 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1010 000005F8 C3                      	retn
  1011                                  efxtoneslide:
  1012                                  PortSlide:
  1013 000005F9 E812000000              	call    VolSlide
  1014 000005FE 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1015 00000601 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
  1016                                  efxvibslide:
  1017                                  VibSlide:
  1018 00000606 E805000000              	call    VolSlide
  1019 0000060B 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
  1020 0000060E EB8D                    	jmp     short Vibrato  ; efxvibrato2
  1021                                  efxvolslide:
  1022                                  VolSlide:
  1023 00000610 88D6                    	mov     dh, dl
  1024 00000612 80E20F                  	and     dl, 0Fh
  1025 00000615 C0EE04                  	shr     dh, 4
  1026 00000618 8A470E                  	mov     al, [edi+TrackInfo.Volume]
  1027 0000061B 28D0                    	sub     al, dl
  1028 0000061D 7D02                    	jge     short NoLoVol
  1029 0000061F 30C0                    	xor     al, al
  1030                                  NoLoVol:        
  1031 00000621 00F0                    	add     al, dh
  1032 00000623 3C40                    	cmp     al, 64
  1033 00000625 7602                    	jbe     short NoHiVol
  1034 00000627 B040                    	mov     al, 64
  1035                                  NoHiVol:        
  1036 00000629 88470E                  	mov     [edi+TrackInfo.Volume], al
  1037 0000062C C3                      	retn
  1038                                  
  1039                                  efxtremolo2:
  1040                                  	; 01/10/2017 (TMODPLAY.ASM)
  1041                                  Tremolo:
  1042 0000062D 88D6                    	mov     dh, dl
  1043 0000062F 6681E20FF0              	and     dx, 0F00Fh
  1044 00000634 C0EE02                  	shr     dh, 2
  1045 00000637 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1046 0000063A 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1047 0000063D 88DE                    	mov	dh, bl
  1048 0000063F C0EB02                  	shr     bl, 2
  1049                                  	; 01/10/2017 - TRDOS 386
  1050                                  	;and	bx, 1Fh
  1051 00000642 83E31F                  	and	ebx, 1Fh 
  1052                                  	;mov	al, [SinTable+bx]
  1053 00000645 8A83[BC530000]          	mov     al, [SinTable+ebx]
  1054 0000064B F6E2                    	mul     dl
  1055 0000064D 66C1E806                	shr	ax, 6
  1056 00000651 84F6                    	test    dh, dh
  1057 00000653 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1058 00000655 66F7D8                  	neg     ax
  1059                                  efxtremolof2:
  1060                                  Tremolo_1:      
  1061 00000658 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1062 0000065B 00E0                    	add     al, ah
  1063 0000065D 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1064 0000065F 30C0                    	xor     al, al
  1065                                  efxtremolof3:
  1066                                  Tremolo_2:       
  1067 00000661 3C40                    	cmp     al, 64 ; 40h
  1068 00000663 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1069 00000665 B040                    	mov     al, 64 ; 40h
  1070                                  efxtremolof4:
  1071                                  Tremolo_3:       
  1072 00000667 28E0                    	sub	al, ah  ; ****** 
  1073 00000669 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1074 0000066C C3                      	retn	
  1075                                  
  1076                                  ;--------------------------------------------------------------------------
  1077                                  ; readchannel - read the next note event from the pattern sheet
  1078                                  ;--------------------------------------------------------------------------
  1079                                  ;
  1080                                  ;--------------------------------------------------------------------------
  1081                                  ; GetTrack:   Get the next Note from a pattern.
  1082                                  ;  In:
  1083                                  ;    ds:di -  Track info Address.
  1084                                  ;    es:si -  Pattern Note Address.
  1085                                  ; Out:
  1086                                  ;    es:si -  The Next Pattern Note address.
  1087                                  ;--------------------------------------------------------------------------
  1088                                  
  1089                                  ; esi = Pattern note address
  1090                                  ; edi = Track info address
  1091                                  
  1092                                  readchannel:
  1093                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1094 0000066D 66AD                    	lodsw
  1095 0000066F 86E0                    	xchg    al, ah
  1096 00000671 88E3                    	mov	bl, ah
  1097 00000673 80E40F                  	and     ah, 0Fh
  1098 00000676 6689C1                  	mov     cx, ax
  1099 00000679 66AD                    	lodsw
  1100 0000067B 86E0                    	xchg    al, ah
  1101 0000067D 88E7                    	mov     bh, ah
  1102 0000067F 80E40F                  	and     ah, 0Fh
  1103 00000682 6689C2                  	mov     dx, ax
  1104 00000685 66895714                	mov     [edi+TrackInfo.Effect], dx
  1105                                  	; 01/10/2017 - TRDOS 386
  1106                                  	;and	bl, 0F0h
  1107 00000689 81E3F0FF0000            	and	ebx, 0FFF0h
  1108 0000068F C0EF04                  	shr     bh, 4
  1109 00000692 08FB                    	or      bl, bh
  1110 00000694 7446                    	jz      short SetPeriod
  1111                                  SetSample:
  1112 00000696 30FF                    	xor	bh, bh
  1113                                  	;and	ebx, 0FFh
  1114 00000698 FECB                    	dec     bl
  1115 0000069A 01DB                    	add     ebx, ebx
  1116 0000069C 668B83[925B0000]        	mov     ax, [ModInfo.SampVol+ebx]
  1117 000006A3 88470E                  	mov     [edi+TrackInfo.Volume], al
  1118 000006A6 668B83[5C5A0000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1119 000006AD 668907                  	mov     [edi+TrackInfo.Samples], ax
  1120 000006B0 668B83[9A5A0000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1121 000006B7 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1122 000006BB 668B83[D85A0000]        	mov     ax, [ModInfo.SampLen+ebx]
  1123 000006C2 66894708                	mov     [edi+TrackInfo.Len], ax
  1124 000006C6 668B83[165B0000]        	mov     ax, [ModInfo.SampRep+ebx]
  1125 000006CD 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1126 000006D1 668B83[545B0000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1127 000006D8 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1128                                  SetPeriod:      
  1129 000006DC 6685C9                  	test    cx, cx
  1130 000006DF 7425                    	jz      short SetEffect
  1131                                  
  1132 000006E1 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1133                                  	
  1134 000006E5 80FE03                  	cmp     dh, 03h
  1135                                  	;je	short SetEffect
  1136 000006E8 7428                    	je	short efxtoneporta ; 01/10/2017
  1137                                  
  1138 000006EA 66894F10                	mov     [edi+TrackInfo.Period], cx
  1139                                  	;movzx	ebx, cx
  1140 000006EE 6689CB                  	mov     bx, cx
  1141 000006F1 6601DB                  	add     bx, bx
  1142                                  	;mov	ax, [PitchTable+bx]
  1143 000006F4 668B83[D05B0000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1144 000006FB 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1145 000006FF C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1146                                  SetEffect:
  1147                                  	;test	dx, dx
  1148                                  	;je	short InitNone
  1149                                  	;cmp	dh, 00h
  1150                                  	;je	InitArpeggio
  1151                                  	;cmp	dh, 03h
  1152                                  	;je	short InitTonePort
  1153                                  	;cmp	dh, 04h
  1154                                  	;je	short InitVibrato
  1155                                  	;cmp	dh, 09h
  1156                                  	;je	short SampleOfs
  1157                                  	;cmp	dh, 0Bh
  1158                                  	;je	short PosJump
  1159                                  	;cmp	dh, 0Ch
  1160                                  	;je	short SetVolume
  1161                                  	;cmp	dh, 0Dh
  1162                                  	;je	short Break
  1163                                  	;cmp	dh, 0Fh
  1164                                  	;je	SetSpeed
  1165                                  	;retn
  1166                                  
  1167                                  	; 01/10/2017 (TMODPLAY.ASM)
  1168                                  	
  1169                                  	; dx = [di+TrackInfo.Effect]
  1170                                  	
  1171 00000706 0FB6C6                  	movzx	eax, dh
  1172 00000709 240F                    	and	al, 0Fh
  1173 0000070B FF2485[94520000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1174                                  ;efxnull:
  1175                                  ;InitNone:
  1176                                  ;	retn
  1177                                  efxtoneporta:
  1178                                  	; 01/10/2017
  1179                                  	; cx = period
  1180                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1181                                  InitTonePort:
  1182 00000712 84D2                    	test    dl, dl
  1183 00000714 7503                    	jnz     short SetPortParm
  1184 00000716 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1185                                  SetPortParm:    
  1186 00000719 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1187 0000071C 66895714                	mov     [edi+TrackInfo.Effect], dx
  1188 00000720 C3                      	retn
  1189                                  efxvibrato:
  1190                                  InitVibrato:
  1191 00000721 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1192 00000724 88C4                    	mov     ah, al
  1193                                  	;and	al, 0Fh
  1194                                  	;and	ah, 0F0h
  1195 00000726 66250FF0                	and	ax, 0F00Fh
  1196 0000072A F6C20F                  	test    dl, 0Fh
  1197 0000072D 7502                    	jne     short OkDepth
  1198 0000072F 08C2                    	or      dl, al
  1199                                  OkDepth:        
  1200 00000731 F6C2F0                  	test    dl, 0F0h
  1201 00000734 7502                    	jnz     short OkRate
  1202 00000736 08E2                    	or      dl, ah
  1203                                  OkRate:         
  1204 00000738 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1205 0000073B 66895714                	mov     [edi+TrackInfo.Effect], dx
  1206 0000073F 6685C9                  	test    cx, cx
  1207 00000742 7404                    	jz      short OkPos
  1208 00000744 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1209                                  OkPos:          
  1210 00000748 C3                      	retn
  1211                                  efxsampoffset:
  1212                                  	; 01/10/2017 ; *******
  1213                                  SampleOfs:         
  1214                                  ;	test    dl, dl
  1215                                  ;	jnz     short SetSampleOfs
  1216                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1217                                  ;SetSampleOfs:
  1218                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1219 00000749 88D6                    	mov     dh, dl
  1220 0000074B 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1221 00000751 895704                  	mov     [edi+TrackInfo.Position], edx
  1222 00000754 C3                      	retn
  1223                                  efxpattjump:
  1224                                  PosJump:
  1225 00000755 8815[7ED70000]          	mov     [OrderPos], dl
  1226 0000075B C605[82D70000]40        	mov     byte [Row], 64
  1227 00000762 C3                      	retn
  1228                                  efxsetvolume:
  1229                                  SetVolume:
  1230 00000763 80FA40                  	cmp     dl, 64
  1231 00000766 7602                    	jbe     short OkVol
  1232 00000768 B240                    	mov     dl, 64
  1233                                  OkVol:
  1234                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1235 0000076A 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1236                                  	;mov	[edi+TrackInfo.Volume], dl
  1237 0000076C 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1238 00000770 C3                      	retn
  1239                                  efxbreak:
  1240                                  Break:
  1241 00000771 88D6                    	mov     dh, dl
  1242 00000773 80E20F                  	and     dl, 0Fh
  1243 00000776 C0EE04                  	shr     dh, 4
  1244 00000779 00F6                    	add     dh, dh
  1245 0000077B 00F2                    	add     dl, dh
  1246 0000077D C0E602                  	shl     dh, 2
  1247 00000780 00F2                    	add     dl, dh
  1248 00000782 8815[83D70000]          	mov     [BreakRow], dl
  1249 00000788 C605[82D70000]40        	mov     byte [Row], 64
  1250 0000078F C3                      	retn
  1251                                  efxsetspeed:
  1252                                  SetSpeed:
  1253 00000790 84D2                    	test    dl,dl
  1254 00000792 7432                    	je      Skip
  1255 00000794 80FA1F                  	cmp     dl,31
  1256 00000797 770D                    	ja      short SetBpm
  1257                                  SetTempo:       
  1258 00000799 8815[7FD70000]          	mov     [Tempo], dl
  1259 0000079F 8815[80D70000]          	mov     [TempoWait], dl
  1260 000007A5 C3                      	retn
  1261                                  SetBpm:
  1262 000007A6 8815[81D70000]          	mov     [Bpm], dl
  1263 000007AC B067                    	mov     al, 103
  1264 000007AE F6E2                    	mul     dl
  1265 000007B0 88E3                    	mov     bl, ah
  1266 000007B2 30FF                    	xor     bh, bh
  1267 000007B4 66A1[CB540000]          	mov     ax, [MixSpeed]
  1268 000007BA 6631D2                  	xor     dx, dx
  1269 000007BD 66F7F3                  	div     bx
  1270 000007C0 66A3[84D70000]          	mov     [BpmSamples], ax
  1271                                  Skip:           
  1272 000007C6 C3                      	retn
  1273                                  efxarpeggio:
  1274                                  	; 01/10/2017
  1275 000007C7 84D2                    	test    dl, dl
  1276                                  	;je	efxnull
  1277 000007C9 74FB                    	je	short Skip
  1278                                  InitArpeggio:
  1279 000007CB 88D6                    	mov     dh, dl
  1280 000007CD 80E20F                  	and     dl, 0Fh
  1281 000007D0 C0EE04                  	shr     dh, 4
  1282                                  	; 01/10/2017
  1283                                  	;mov	cx, 36
  1284 000007D3 66B95400                	mov	cx, 84 ; 84 notes/periods
  1285 000007D7 31DB                    	xor     ebx, ebx
  1286 000007D9 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1287                                  gt_ScanPeriod:
  1288                                  	;cmp	ax, [PeriodTable+bx]
  1289 000007DD 663B83[14530000]        	cmp	ax, [PeriodTable+ebx]
  1290 000007E4 7306                    	jae     short SetArp
  1291 000007E6 6683C302                	add     bx, 2
  1292 000007EA E2F1                    	loop    gt_ScanPeriod
  1293                                  SetArp:         
  1294 000007EC 6601D2                  	add     dx, dx
  1295 000007EF 00DE                    	add     dh, bl
  1296 000007F1 00DA                    	add     dl, bl
  1297                                  	; 01/10/2017
  1298                                  	;mov	bx, [PeriodTable+bx]
  1299 000007F3 668B9B[14530000]        	mov	bx, [PeriodTable+ebx]
  1300                                  	;add	bx, bx
  1301 000007FA 01DB                    	add	ebx, ebx
  1302                                  	;mov	ax, [PitchTable+bx]
  1303 000007FC 668B83[D05B0000]        	mov	ax, [PitchTable+ebx]
  1304 00000803 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1305 00000807 88F3                    	mov     bl, dh
  1306 00000809 30FF                    	xor     bh, bh
  1307 0000080B 668B9B[14530000]        	mov	bx, [PeriodTable+ebx]
  1308                                  	;add	bx, bx
  1309 00000812 01DB                    	add	ebx, ebx
  1310                                  	;mov	ax, [PitchTable+bx]
  1311 00000814 668B83[D05B0000]        	mov	ax, [PitchTable+ebx]
  1312 0000081B 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1313 0000081F 88D3                    	mov     bl, dl
  1314 00000821 30FF                    	xor     bh, bh
  1315 00000823 668B9B[14530000]        	mov	bx, [PeriodTable+ebx]
  1316                                  	;add	bx, bx
  1317 0000082A 01DB                    	add	ebx, ebx
  1318                                  	;mov	ax, [PitchTable+bx]
  1319 0000082C 668B83[D05B0000]        	mov	ax, [PitchTable+ebx]
  1320 00000833 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1321 00000837 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1322 0000083D C3                      	retn
  1323                                  
  1324                                  efxtremolo:
  1325                                  	; 01/10/2017 (TMODPLAY.ASM)
  1326                                  InitTremolo:
  1327 0000083E 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1328 00000841 88C4                    	mov     ah, al
  1329 00000843 66250FF0                	and     ax, 0F00Fh
  1330 00000847 F6C20F                  	test    dl, 0Fh
  1331 0000084A 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1332 0000084C 08C2                    	or      dl, al
  1333                                  efxtremolof0:
  1334                                  InitTremolo_1: 
  1335 0000084E F6C2F0                  	test    dl, 0F0h
  1336 00000851 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1337 00000853 08E2                    	or      dl, ah
  1338                                  efxtremolof1:
  1339                                  InitTremolo_2:
  1340 00000855 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1341 00000858 66895714                	mov     [edi+TrackInfo.Effect], dx
  1342 0000085C C3                      	retn
  1343                                  
  1344                                  ;--------------------------------------------------------------------------
  1345                                  ; pollmodule - polls the module player
  1346                                  ;--------------------------------------------------------------------------
  1347                                  ;--------------------------------------------------------------------------
  1348                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1349                                  ;--------------------------------------------------------------------------
  1350                                  
  1351                                  pollmodule:
  1352                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1353 0000085D FE0D[80D70000]          	dec     byte [TempoWait]
  1354 00000863 7417                    	jz      short GetTracks
  1355                                  
  1356                                  	;mov	ecx, NumTracks
  1357 00000865 0FB70D[C5540000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1358 0000086C BF[94D70000]            	mov	edi, Tracks
  1359                                  BeatTracks:
  1360 00000871 E86EFCFFFF              	call	BeatTrack	
  1361 00000876 83C726                  	add	edi, TrackInfo.size
  1362 00000879 E2F6                    	loop	BeatTracks
  1363 0000087B C3                      	retn
  1364                                  GetTracks:
  1365 0000087C A0[7FD70000]            	mov     al, [Tempo]
  1366 00000881 A2[80D70000]            	mov     [TempoWait], al
  1367                                  
  1368 00000886 8B35[90D70000]          	mov	esi, [Note]
  1369 0000088C 803D[82D70000]40        	cmp     byte [Row], 64
  1370 00000893 7268                    	jb      short NoPattWrap
  1371                                  
  1372 00000895 8B35[585A0000]          	mov	esi, [ModInfo.Patterns]
  1373 0000089B 8A1D[7ED70000]          	mov     bl, [OrderPos]
  1374 000008A1 3A1D[D6590000]          	cmp     bl, [ModInfo.OrderLen]
  1375 000008A7 7214                    	jb      short NoOrderWrap
  1376 000008A9 8A1D[D7590000]          	mov     bl, [ModInfo.ReStart]
  1377 000008AF 881D[7ED70000]          	mov     [OrderPos], bl
  1378 000008B5 3A1D[D6590000]          	cmp     bl, [ModInfo.OrderLen]
  1379 000008BB 7364                    	jae     short NoUpdate
  1380                                  NoOrderWrap:    
  1381                                  	;xor	bh, bh
  1382 000008BD 81E3FF000000            	and	ebx, 0FFh
  1383 000008C3 8A9B[D8590000]          	mov     bl, [ModInfo.Order+ebx]
  1384                                  	; 05/10/2017
  1385                                  	;shl	ebx, 10 ; *1024
  1386 000008C9 8A0D[C4540000]          	mov	cl, [pattern_shift] ; 10 or 11
  1387 000008CF D3E3                    	shl	ebx, cl ; *1024 or *2048
  1388                                  	;
  1389 000008D1 01DE                    	add     esi, ebx
  1390 000008D3 8A1D[83D70000]          	mov     bl, [BreakRow]
  1391 000008D9 881D[82D70000]          	mov     [Row], bl
  1392                                  	;xor	bh, bh
  1393 000008DF 81E3FF000000            	and	ebx, 0FFh
  1394 000008E5 883D[83D70000]          	mov     [BreakRow], bh ; 0
  1395 000008EB 66C1E304                	shl     bx, 4
  1396 000008EF 01DE                    	add     esi, ebx
  1397 000008F1 8935[90D70000]          	mov     [Note], esi
  1398 000008F7 FE05[7ED70000]          	inc     byte [OrderPos]
  1399                                  NoPattWrap:     
  1400 000008FD FE05[82D70000]          	inc     byte [Row]
  1401                                  
  1402                                  	;cld
  1403                                  	;mov	ecx, NumTracks
  1404 00000903 0FB70D[C5540000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1405 0000090A BF[94D70000]            	mov	edi, Tracks
  1406                                  GetTracks_next:
  1407 0000090F 51                      	push	ecx	
  1408 00000910 E858FDFFFF              	call	GetTrack ; readchannel
  1409 00000915 59                      	pop	ecx
  1410 00000916 83C726                  	add	edi, TrackInfo.size
  1411 00000919 E2F4                    	loop	GetTracks_next
  1412                                  
  1413 0000091B 8935[90D70000]          	mov     [Note], esi
  1414                                  NoUpdate:
  1415 00000921 C3                      	retn
  1416                                  
  1417                                  ;--------------------------------------------------------------------------
  1418                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1419                                  ;  In:
  1420                                  ;   ds:si -  Track Info Address.
  1421                                  ;   ds:di -  Buffer Address.
  1422                                  ;    cx   -  Buffer Size.
  1423                                  ;--------------------------------------------------------------------------
  1424                                  
  1425                                  ; esi = Track info address
  1426                                  ; edi = Buffer address
  1427                                  ; ecx = Buffer size
  1428                                  
  1429                                  MixTrack:
  1430 00000922 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1431 00000927 7757                    	ja      short MixLooped
  1432                                  MixNonLooped:   
  1433 00000929 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1434 0000092B 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1435 0000092E 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1436 00000932 52                      	push    edx
  1437 00000933 56                      	push    esi
  1438 00000934 01D3                    	add     ebx, edx
  1439 00000936 01D5                    	add     ebp, edx
  1440 00000938 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1441                                  	; 01/10/2017
  1442                                  	;mov	al, [esi+TrackInfo.Volume]
  1443 0000093C 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1444                                  	; ah = [esi+TrackInfo.VolDiff]
  1445 00000940 00E0                    	add	al, ah ; ****** 
  1446 00000942 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1447 00000946 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1448 00000949 89DE                    	mov     esi, ebx
  1449 0000094B 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1450 0000094D 88C7                    	mov     bh, al
  1451 0000094F 88D0                    	mov     al, dl
  1452 00000951 88F2                    	mov     dl, dh
  1453                                  	;xor	dh, dh
  1454 00000953 81E2FF000000            	and	edx, 0FFh
  1455                                  nlMixSamp:      
  1456 00000959 39EE                    	cmp     esi, ebp
  1457 0000095B 7316                    	jae     short nlMixBye
  1458 0000095D 8A1E                    	mov     bl, [esi]
  1459                                  	;mov	bl, [VolTable+bx]
  1460 0000095F 8A9B[92760000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1461                                  	; 17/10/2017
  1462 00000965 001F                    	add     [edi], bl
  1463                                  	; 18/10/2017
  1464 00000967 00C4                    	add     ah, al
  1465 00000969 11D6                    	adc     esi, edx
  1466 0000096B 033D[C5540000]          	add	edi, [numtracks]
  1467 00000971 E2E6                    	loop    nlMixSamp
  1468                                  nlMixBye:       
  1469 00000973 89F3                    	mov     ebx, esi
  1470 00000975 5E                      	pop     esi
  1471 00000976 5A                      	pop     edx
  1472 00000977 29D3                    	sub     ebx, edx
  1473 00000979 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1474 0000097C 88661D                  	mov     [esi+TrackInfo.Error], ah
  1475 0000097F C3                      	retn
  1476                                  MixLooped:
  1477 00000980 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1478 00000982 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1479 00000985 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1480 00000989 892D[8CD70000]          	mov     [BufRep], ebp
  1481                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1482 0000098F 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1483 00000993 52                      	push    edx
  1484 00000994 56                      	push    esi
  1485 00000995 01D3                    	add     ebx, edx
  1486 00000997 01D5                    	add     ebp, edx
  1487 00000999 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1488                                  	; 01/10/2017
  1489                                  	;mov	al, [esi+TrackInfo.Volume]
  1490 0000099D 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1491                                  	; ah = [esi+TrackInfo.VolDiff]
  1492 000009A1 00E0                    	add	al, ah ; ****** 
  1493 000009A3 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1494 000009A7 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1495                                  	;mov	si, bx
  1496 000009AA 89DE                    	mov	esi, ebx ; 04/09/2017
  1497 000009AC 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1498 000009AE 88C7                    	mov     bh, al
  1499 000009B0 88D0                    	mov     al, dl
  1500 000009B2 88F2                    	mov     dl, dh
  1501                                  	;xor	dh, dh
  1502 000009B4 81E2FF000000            	and	edx, 0FFh
  1503                                  lpMixSamp:      
  1504 000009BA 39EE                    	cmp     esi, ebp
  1505 000009BC 7206                    	jb      short lpMixNow
  1506 000009BE 2B35[8CD70000]          	sub     esi, [BufRep]
  1507                                  lpMixNow:       
  1508 000009C4 8A1E                    	mov     bl, [esi]
  1509                                  	;mov	bl, [VolTable+bx]
  1510 000009C6 8A9B[92760000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1511                                  	; 17/10/2017
  1512 000009CC 001F                    	add     [edi], bl
  1513                                  	; 18/10/2017
  1514 000009CE 00C4                    	add     ah, al
  1515 000009D0 11D6                    	adc     esi, edx
  1516 000009D2 033D[C5540000]          	add	edi, [numtracks]
  1517 000009D8 E2E0                    	loop    lpMixSamp
  1518                                  lpMixBye:       
  1519                                  ;	mov     ebx, esi
  1520                                  ;	pop     esi
  1521                                  ;	pop     edx
  1522                                  ;	sub     ebx, edx
  1523                                  ;	mov     [esi+TrackInfo.Position], ebx
  1524                                  ;	mov     [esi+TrackInfo.Error], ah
  1525                                  ;	retn
  1526 000009DA EB97                    	jmp	short nlMixBye
  1527                                  
  1528                                  ;--------------------------------------------------------------------------
  1529                                  ; mixpoll - updates the output buffer
  1530                                  ;--------------------------------------------------------------------------
  1531                                  ;
  1532                                  ;--------------------------------------------------------------------------
  1533                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1534                                  ;  In:
  1535                                  ;    Buffer  - Buffer Address.
  1536                                  ;    Count   - Buffer Size.
  1537                                  ;--------------------------------------------------------------------------
  1538                                  
  1539                                  mixpoll:
  1540                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1541                                  	; edi = buffer address
  1542                                  	; ebx = count
  1543                                  
  1544 000009DC 60                      	pushad
  1545                                  
  1546                                  	;cld
  1547                                  NextChunk:      
  1548 000009DD 66833D[8AD70000]00      	cmp     word [BufLen], 0
  1549 000009E5 756B                    	jne     short CopyChunk
  1550                                  
  1551 000009E7 53                      	push    ebx
  1552 000009E8 57                      	push    edi
  1553                                  MixChunk:       
  1554 000009E9 BF[92B70000]            	mov	edi, MixBuffer
  1555                                  
  1556                                  	; 17/10/2017
  1557 000009EE 0FB70D[84D70000]        	movzx	ecx, word [BpmSamples]
  1558                                  	;mov	cx, [BpmSamples]
  1559 000009F5 893D[86D70000]          	mov     [BufPtr], edi
  1560 000009FB 66890D[8AD70000]        	mov	[BufLen], cx
  1561                                  
  1562 00000A02 803D[C5540000]04        	cmp	byte [numtracks], 4
  1563 00000A09 7603                    	jna	short ch_silence
  1564 00000A0B 66D1E1                  	shl	cx, 1 
  1565                                  ch_silence:
  1566 00000A0E B880808080              	mov	eax, 80808080h
  1567 00000A13 F3AB                    	rep	stosd
  1568                                  
  1569                                  	;mov	cx, NumTracks
  1570                                  	;mov	cl, NumTracks ; 01/10/2017
  1571 00000A15 8A0D[C5540000]          	mov	cl, [numtracks] ; 06/10/2017
  1572 00000A1B BE[6ED70000]            	mov	esi, Tracks - TrackInfo.size
  1573                                  GetSamples_next:
  1574 00000A20 51                      	push	ecx
  1575 00000A21 83C626                  	add	esi, TrackInfo.size
  1576 00000A24 668B0D[8AD70000]        	mov	cx, [BufLen]
  1577 00000A2B 8B3D[86D70000]          	mov	edi, [BufPtr]
  1578 00000A31 E8ECFEFFFF              	call	MixTrack
  1579 00000A36 59                      	pop	ecx
  1580 00000A37 FF05[86D70000]          	inc	dword [BufPtr] ; 18/10/2017
  1581 00000A3D E2E1                    	loop	GetSamples_next
  1582                                  
  1583                                   	; 18/10/2017	
  1584 00000A3F 8B1D[C5540000]          	mov	ebx, [numtracks]
  1585 00000A45 291D[86D70000]          	sub	dword [BufPtr], ebx
  1586                                  
  1587 00000A4B E80DFEFFFF              	call    UpdateTracks
  1588                                  
  1589 00000A50 5F                      	pop     edi
  1590 00000A51 5B                      	pop     ebx
  1591                                  CopyChunk:      
  1592                                  	;mov	cx, [BufLen]
  1593 00000A52 0FB70D[8AD70000]        	movzx	ecx, word [BufLen]
  1594 00000A59 39D9                    	cmp	ecx, ebx
  1595                                  	;cmp	cx, bx
  1596 00000A5B 7602                    	jbe     short MoveChunk
  1597                                  	;mov	cx, bx
  1598 00000A5D 89D9                    	mov     ecx, ebx
  1599                                  MoveChunk:
  1600 00000A5F 8B35[86D70000]          	mov     esi, [BufPtr]
  1601 00000A65 010D[86D70000]          	add     [BufPtr], ecx
  1602 00000A6B 66290D[8AD70000]        	sub     [BufLen], cx
  1603 00000A72 29CB                    	sub     ebx, ecx
  1604                                  	; 17/10/2017 ; STEREO MIXING
  1605                                  	;rep	movsb
  1606                                  	; 18/10/2017
  1607 00000A74 803D[C5540000]04        	cmp	byte [numtracks], 4
  1608                                  	;jna	short _4_channels_mix
  1609 00000A7B 762F                    	jna	_4_channels_mix
  1610                                  	
  1611                                  _8_channels_mix:
  1612                                  	; 18/10/2017
  1613 00000A7D AD                      	lodsd 
  1614 00000A7E 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1615 00000A80 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1616 00000A83 00C6                    	add	dh, al ; ch1 + ch4
  1617 00000A85 00E2                    	add	dl, ah ; ch2 + ch3
  1618                                  
  1619 00000A87 AD                      	lodsd
  1620 00000A88 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1621 00000A8A 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1622 00000A8C C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1623                                  	; 19/10/2017
  1624 00000A8F 00E6                    	add	dh, ah ; ch1 + ch4 + ch5 + ch8
  1625 00000A91 00C2                    	add	dl, al ; ch2 + ch3 + ch6 + ch7
  1626                                  
  1627                                  	; L = ch1 + ch4 + ch5 + ch8
  1628                                  	; R = ch2 + ch3 + ch6 + ch7
  1629                                  
  1630 00000A93 6681C28080              	add	dx, 8080h
  1631                                  
  1632                                  	; 19/10/2017
  1633 00000A98 88F4                    	mov	ah, dh
  1634 00000A9A 80EC80                  	sub	ah, 80h
  1635 00000A9D 30C0                    	xor	al, al
  1636 00000A9F 66AB                    	stosw ; Left Channel
  1637 00000AA1 88D4                    	mov	ah, dl
  1638 00000AA3 80EC80                  	sub	ah, 80h
  1639 00000AA6 66AB                    	stosw ; Right Channel
  1640                                  
  1641 00000AA8 E2D3                    	loop	_8_channels_mix
  1642                                  	
  1643 00000AAA EB21                    	jmp	short channel_mix_ok
  1644                                  	
  1645                                  _4_channels_mix:
  1646                                  	; 18/10/2017
  1647 00000AAC AD                      	lodsd 
  1648 00000AAD 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1649                                  	; 19/10/2017
  1650 00000AAF C1E810                  	shr	eax, 16 ; ch3 (al), ch4 (ah)
  1651 00000AB2 00E2                    	add	dl, ah ; ch1 + ch4
  1652 00000AB4 00C6                    	add	dh, al ; ch2 + ch3
  1653                                  
  1654                                  	; L = ch1 + ch4
  1655                                  	; R = ch2 + ch3
  1656                                  
  1657                                  	; 19/10/2017
  1658 00000AB6 6681C28080              	add	dx, 8080h
  1659                                  
  1660                                  	; 19/10/2017
  1661 00000ABB 88D4                    	mov	ah, dl
  1662 00000ABD 80EC80                  	sub	ah, 80h
  1663 00000AC0 30C0                    	xor	al, al
  1664 00000AC2 66AB                    	stosw ; Left Channel
  1665 00000AC4 88F4                    	mov	ah, dh
  1666 00000AC6 80EC80                  	sub	ah, 80h
  1667 00000AC9 66AB                    	stosw ; Right Channel
  1668                                  	
  1669 00000ACB E2DF                    	loop	_4_channels_mix
  1670                                  
  1671                                  channel_mix_ok:
  1672 00000ACD 85DB                    	test    ebx, ebx
  1673                                  	;jnz	short NextChunk
  1674 00000ACF 0F8508FFFFFF            	jnz	NextChunk ; 17/10/2017
  1675                                  
  1676                                  	; 20/10/2017
  1677                                  	; 19/10/2017
  1678                                  	; Pan Control
  1679 00000AD5 8A0D[24E30000]          	mov	cl, [pan_shift]
  1680 00000ADB 08C9                    	or	cl, cl
  1681 00000ADD 744D                    	jz	short c_smpl_2
  1682                                  
  1683                                  	; 20/10/2017
  1684 00000ADF BB00200000              	mov	ebx, BUFFERSIZE/4 ; 8192
  1685 00000AE4 BF[00F00000]            	mov	edi, Audio_Buffer
  1686                                  
  1687 00000AE9 B508                    	mov	ch, 8
  1688 00000AEB D2E5                    	shl	ch, cl
  1689                                  c_smpl_1:
  1690 00000AED 8B17                    	mov	edx, [edi]
  1691 00000AEF 6689D0                  	mov	ax, dx
  1692 00000AF2 80FC80                  	cmp	ah, 80h
  1693 00000AF5 7208                    	jb	short _cs1	
  1694 00000AF7 00EC                    	add	ah, ch
  1695 00000AF9 730A                    	jnc	short _cs2
  1696 00000AFB B4FF                    	mov	ah, 255
  1697 00000AFD EB06                    	jmp	short _cs2
  1698                                  _cs1:
  1699 00000AFF 28EC                    	sub	ah, ch
  1700 00000B01 7302                    	jnc	short _cs2
  1701 00000B03 B400                    	mov	ah, 0
  1702                                  _cs2:
  1703 00000B05 C1CA10                  	ror	edx, 16 ; dx = [edi+2]
  1704 00000B08 00F4                    	add	ah, dh
  1705 00000B0A 6692                    	xchg	dx, ax ; xchg [edi+2], ax
  1706 00000B0C 80FC80                  	cmp	ah, 80h
  1707 00000B0F 7208                    	jb	short _cs3	
  1708 00000B11 00EC                    	add	ah, ch
  1709 00000B13 730A                    	jnc	short _cs4
  1710 00000B15 B4FF                    	mov	ah, 255
  1711 00000B17 EB06                    	jmp	short _cs4
  1712                                  _cs3:
  1713 00000B19 28EC                    	sub	ah, ch
  1714 00000B1B 7302                    	jnc	short _cs4
  1715 00000B1D B400                    	mov	ah, 0
  1716                                  _cs4:
  1717 00000B1F C1CA10                  	ror	edx, 16 ; dx = [edi]
  1718 00000B22 00E6                    	add	dh, ah
  1719 00000B24 8917                    	mov	[edi], edx
  1720                                  _cs5:
  1721                                  	; 20/10/2017
  1722 00000B26 83C704                  	add	edi, 4
  1723 00000B29 4B                      	dec	ebx
  1724 00000B2A 75C1                    	jnz	short c_smpl_1	
  1725                                  c_smpl_2:
  1726 00000B2C 61                      	popad	
  1727 00000B2D C3                      	retn
  1728                                  
  1729                                  ;--------------------------------------------------------------------------
  1730                                  ; StartPlaying: Initializes the Sound System.
  1731                                  ;  In:
  1732                                  ;   Module Information Resources.
  1733                                  ;--------------------------------------------------------------------------
  1734                                  
  1735                                  StartPlaying:
  1736 00000B2E 60                      	pushad
  1737                                  SetModParms:    
  1738 00000B2F C605[7ED70000]00        	mov     byte [OrderPos], 0
  1739 00000B36 C605[7FD70000]06        	mov     byte [Tempo], DefTempo
  1740 00000B3D C605[80D70000]06        	mov     byte [TempoWait], DefTempo
  1741 00000B44 C605[81D70000]7D        	mov     byte [Bpm], DefBpm
  1742 00000B4B C605[82D70000]40        	mov     byte [Row], 64
  1743 00000B52 C605[83D70000]00        	mov     byte [BreakRow], 0
  1744 00000B59 66A1[CB540000]          	mov     ax, [MixSpeed]
  1745 00000B5F 31D2                    	xor     edx, edx
  1746 00000B61 66BB3200                	mov     bx, 24*DefBpm/60
  1747 00000B65 66F7F3                  	div     bx
  1748 00000B68 66A3[84D70000]          	mov     [BpmSamples], ax
  1749                                  ClearTracks:    
  1750 00000B6E BF[94D70000]            	mov     edi, Tracks
  1751                                  	; 07/10/2017
  1752                                  	;mov	ecx, NumTracks*TrackInfo.size
  1753 00000B73 B826000000              	mov	eax, TrackInfo.size
  1754 00000B78 0FB70D[C5540000]        	movzx	ecx, word [numtracks]
  1755 00000B7F F7E1                    	mul	ecx
  1756 00000B81 89C1                    	mov	ecx, eax
  1757 00000B83 31C0                    	xor     eax, eax
  1758                                  	;cld
  1759 00000B85 F3AA                    	rep     stosb
  1760                                  
  1761 00000B87 A3[86D70000]            	mov     [BufPtr], eax
  1762 00000B8C 66A3[8AD70000]          	mov     [BufLen], ax
  1763                                  MakePitch:
  1764 00000B92 66B80021                	mov     ax, MidCRate
  1765 00000B96 66BBAC01                	mov     bx, 428
  1766 00000B9A 66F7E3                  	mul     bx
  1767 00000B9D 66F735[CB540000]        	div     word [MixSpeed]
  1768 00000BA4 30F6                    	xor     dh, dh
  1769 00000BA6 88E2                    	mov     dl, ah
  1770 00000BA8 88C4                    	mov     ah, al
  1771 00000BAA 30C0                    	xor     al, al
  1772                                  	;mov	cx, 857
  1773 00000BAC 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1774 00000BB0 31DB                    	xor     ebx, ebx
  1775 00000BB2 BF[D05B0000]            	mov     edi, PitchTable
  1776                                  PitchLoop:      
  1777 00000BB7 50                      	push    eax
  1778 00000BB8 52                      	push    edx
  1779 00000BB9 6639DA                  	cmp     dx, bx
  1780 00000BBC 7303                    	jae     short NoDiv
  1781 00000BBE 66F7F3                  	div     bx
  1782                                  NoDiv:          
  1783 00000BC1 66AB                    	stosw
  1784 00000BC3 5A                      	pop     edx
  1785 00000BC4 58                      	pop     eax
  1786                                  	;inc	bx
  1787 00000BC5 43                      	inc	ebx
  1788 00000BC6 E2EF                    	loop    PitchLoop
  1789                                  MakeVolume:     
  1790 00000BC8 66B90041                	mov     cx, 16640
  1791 00000BCC 89CB                    	mov     ebx, ecx
  1792                                  VolLoop:
  1793 00000BCE 664B                    	dec     bx
  1794 00000BD0 88D8                    	mov     al, bl
  1795 00000BD2 F6EF                    	imul    bh
  1796                                  	;mov	[VolTable+bx], ah
  1797 00000BD4 88A3[92760000]          	mov     [VolTable+ebx], ah
  1798 00000BDA E2F2                    	loop    VolLoop
  1799                                  
  1800 00000BDC 61                      	popad
  1801 00000BDD C3                      	retn
  1802                                  
  1803                                  ;--------------------------------------------------------------------------
  1804                                  ; StopPlaying: ShutDown the Sound System.
  1805                                  ;--------------------------------------------------------------------------
  1806                                  
  1807                                  StopPlaying:
  1808                                  	; 19/06/2017
  1809                                  	; Stop Playing
  1810                                  	sys	_audio, 0700h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BDE BB00070000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BE3 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BE8 CD40                <1>  int 40h
  1811                                  	; Cancel callback service (for user)
  1812                                  	sys	_audio, 0900h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BEA BB00090000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BEF B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BF4 CD40                <1>  int 40h
  1813                                  	; Deallocate Audio Buffer (for user)
  1814                                  	sys	_audio, 0A00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BF6 BB000A0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BFB B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000C00 CD40                <1>  int 40h
  1815                                  	; Disable Audio Device
  1816                                  	sys	_audio, 0C00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000C02 BB000C0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000C07 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000C0C CD40                <1>  int 40h
  1817                                  
  1818 00000C0E C3                      	retn
  1819                                  
  1820                                  ;=============================================================================
  1821                                  ; 
  1822                                  ;=============================================================================
  1823                                  
  1824                                  ;dword2str:
  1825                                  ;	; 13/11/2016 - Erdogan Tan 
  1826                                  ;	; eax = dword value
  1827                                  ;	;
  1828                                  ;	call	dwordtohex
  1829                                  ;	mov	[dword_str], edx
  1830                                  ;	mov	[dword_str+4], eax
  1831                                  ;	mov	si, dword_str
  1832                                  ;	retn
  1833                                  
  1834                                  	; 05/03/2017 (TRDOS 386)
  1835                                  	; trdos386.s (unix386.s) - 10/05/2015
  1836                                  	; Convert binary number to hexadecimal string
  1837                                  
  1838                                  ;bytetohex:
  1839                                  ;	; INPUT ->
  1840                                  ;	; 	AL = byte (binary number)
  1841                                  ;	; OUTPUT ->
  1842                                  ;	;	AX = hexadecimal string
  1843                                  ;	;
  1844                                  ;	push	ebx
  1845                                  ;	movzx	ebx, al
  1846                                  ;	shr	bl, 4
  1847                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1848                                  ;	xchg	bl, al
  1849                                  ;	and	bl, 0Fh
  1850                                  ;	mov	ah, [ebx+hex_chars] 
  1851                                  ;	pop	ebx	
  1852                                  ;	retn
  1853                                  
  1854                                  ;wordtohex:
  1855                                  ;	; INPUT ->
  1856                                  ;	; 	AX = word (binary number)
  1857                                  ;	; OUTPUT ->
  1858                                  ;	;	EAX = hexadecimal string
  1859                                  ;	;
  1860                                  ;	push	ebx
  1861                                  ;	xor	ebx, ebx
  1862                                  ;	xchg	ah, al
  1863                                  ;	push	eax
  1864                                  ;	mov	bl, ah
  1865                                  ;	shr	bl, 4
  1866                                  ;	mov	al, [ebx+hex_chars] 	 	
  1867                                  ;	mov	bl, ah
  1868                                  ;	and	bl, 0Fh
  1869                                  ;	mov	ah, [ebx+hex_chars]
  1870                                  ;	shl	eax, 16
  1871                                  ;	pop	eax
  1872                                  ;	pop	ebx
  1873                                  ;	jmp	short bytetohex
  1874                                  
  1875                                  ;dwordtohex:
  1876                                  ;	; INPUT ->
  1877                                  ;	; 	EAX = dword (binary number)
  1878                                  ;	; OUTPUT ->
  1879                                  ;	;	EDX:EAX = hexadecimal string
  1880                                  ;	;
  1881                                  ;	push	eax
  1882                                  ;	shr	eax, 16
  1883                                  ;	call	wordtohex
  1884                                  ;	mov	edx, eax
  1885                                  ;	pop	eax
  1886                                  ;	call	wordtohex
  1887                                  ;	retn
  1888                                  
  1889                                  	; 27/12/2024
  1890                                  	; 04/06/2024 (BugFix)
  1891                                  	; 24/06/2017
  1892                                  	; 19/06/2017
  1893                                  	; 05/03/2017 (TRDOS 386)
  1894                                  	; 13/11/2016 - Erdogan Tan
  1895                                  write_audio_dev_info:
  1896                                  	; BUS/DEV/FN
  1897                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1898                                  	; DEV/VENDOR
  1899                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1900                                  
  1901                                  	;mov	esi, [dev_vendor]
  1902                                  	; 04/06/2024
  1903 00000C0F A1[84550000]            	mov	eax, [dev_vendor]
  1904 00000C14 0FB6D8                  	movzx	ebx, al
  1905 00000C17 88DA                    	mov	dl, bl
  1906 00000C19 80E30F                  	and	bl, 0Fh
  1907 00000C1C 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1908 00000C22 A2[12550000]            	mov	[msgVendorId+3], al
  1909 00000C27 88D3                    	mov	bl, dl
  1910 00000C29 C0EB04                  	shr	bl, 4
  1911 00000C2C 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1912 00000C32 A2[11550000]            	mov	[msgVendorId+2], al
  1913 00000C37 88E3                    	mov	bl, ah
  1914 00000C39 88DA                    	mov	dl, bl
  1915 00000C3B 80E30F                  	and	bl, 0Fh
  1916 00000C3E 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1917 00000C44 A2[10550000]            	mov	[msgVendorId+1], al
  1918 00000C49 88D3                    	mov	bl, dl
  1919 00000C4B C0EB04                  	shr	bl, 4
  1920 00000C4E 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1921 00000C54 A2[0F550000]            	mov	[msgVendorId], al
  1922                                  	;shr	esi, 16
  1923                                  	; 04/06/2024
  1924 00000C59 C1E810                  	shr	eax, 16
  1925 00000C5C 88C3                    	mov	bl, al
  1926 00000C5E 88DA                    	mov	dl, bl
  1927 00000C60 80E30F                  	and	bl, 0Fh
  1928 00000C63 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1929 00000C69 A2[23550000]            	mov	[msgDevId+3], al
  1930 00000C6E 88D3                    	mov	bl, dl
  1931 00000C70 C0EB04                  	shr	bl, 4
  1932 00000C73 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1933 00000C79 A2[22550000]            	mov	[msgDevId+2], al
  1934 00000C7E 88E3                    	mov	bl, ah
  1935 00000C80 88DA                    	mov	dl, bl
  1936 00000C82 80E30F                  	and	bl, 0Fh
  1937 00000C85 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1938 00000C8B A2[21550000]            	mov	[msgDevId+1], al
  1939 00000C90 88D3                    	mov	bl, dl
  1940 00000C92 C0EB04                  	shr	bl, 4
  1941 00000C95 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1942 00000C9B A2[20550000]            	mov	[msgDevId], al
  1943                                  
  1944                                  	;mov	esi, [bus_dev_fn]
  1945                                  	;shr	esi, 8
  1946                                  	;mov	ax, si
  1947                                  	; 04/06/2024
  1948 00000CA0 A1[88550000]            	mov	eax, [bus_dev_fn]
  1949 00000CA5 C1E808                  	shr	eax, 8
  1950 00000CA8 88C3                    	mov	bl, al
  1951 00000CAA 88DA                    	mov	dl, bl
  1952 00000CAC 80E307                  	and	bl, 7 ; bit 0,1,2
  1953 00000CAF 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1954 00000CB5 A2[47550000]            	mov	[msgFncNo+1], al
  1955 00000CBA 88D3                    	mov	bl, dl
  1956 00000CBC C0EB03                  	shr	bl, 3
  1957 00000CBF 88DA                    	mov	dl, bl
  1958 00000CC1 80E30F                  	and	bl, 0Fh
  1959 00000CC4 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1960 00000CCA A2[39550000]            	mov	[msgDevNo+1], al
  1961 00000CCF 88D3                    	mov	bl, dl
  1962 00000CD1 C0EB04                  	shr	bl, 4
  1963 00000CD4 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1964 00000CDA A2[38550000]            	mov	[msgDevNo], al
  1965 00000CDF 88E3                    	mov	bl, ah
  1966 00000CE1 88DA                    	mov	dl, bl
  1967 00000CE3 80E30F                  	and	bl, 0Fh
  1968 00000CE6 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1969 00000CEC A2[2D550000]            	mov	[msgBusNo+1], al
  1970 00000CF1 88D3                    	mov	bl, dl
  1971 00000CF3 C0EB04                  	shr	bl, 4
  1972 00000CF6 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1973 00000CFC A2[2C550000]            	mov	[msgBusNo], al
  1974                                  
  1975                                  	; 24/06/2017
  1976 00000D01 66A1[90550000]          	mov	ax, [ac97_NamBar]
  1977 00000D07 88C3                    	mov	bl, al
  1978 00000D09 88DA                    	mov	dl, bl
  1979 00000D0B 80E30F                  	and	bl, 0Fh
  1980 00000D0E 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1981 00000D14 A2[56550000]            	mov	[msgNamBar+3], al
  1982 00000D19 88D3                    	mov	bl, dl
  1983 00000D1B C0EB04                  	shr	bl, 4
  1984 00000D1E 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1985 00000D24 A2[55550000]            	mov	[msgNamBar+2], al
  1986 00000D29 88E3                    	mov	bl, ah
  1987 00000D2B 88DA                    	mov	dl, bl
  1988 00000D2D 80E30F                  	and	bl, 0Fh
  1989 00000D30 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1990 00000D36 A2[54550000]            	mov	[msgNamBar+1], al
  1991 00000D3B 88D3                    	mov	bl, dl
  1992 00000D3D C0EB04                  	shr	bl, 4
  1993 00000D40 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  1994 00000D46 A2[53550000]            	mov	[msgNamBar], al
  1995                                  
  1996 00000D4B 66A1[92550000]          	mov	ax, [ac97_NabmBar]
  1997 00000D51 88C3                    	mov	bl, al
  1998 00000D53 88DA                    	mov	dl, bl
  1999 00000D55 80E30F                  	and	bl, 0Fh
  2000 00000D58 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  2001 00000D5E A2[66550000]            	mov	[msgNabmBar+3], al
  2002 00000D63 88D3                    	mov	bl, dl
  2003 00000D65 C0EB04                  	shr	bl, 4
  2004 00000D68 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  2005 00000D6E A2[65550000]            	mov	[msgNabmBar+2], al
  2006 00000D73 88E3                    	mov	bl, ah
  2007 00000D75 88DA                    	mov	dl, bl
  2008 00000D77 80E30F                  	and	bl, 0Fh
  2009 00000D7A 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  2010 00000D80 A2[64550000]            	mov	[msgNabmBar+1], al
  2011 00000D85 88D3                    	mov	bl, dl
  2012 00000D87 C0EB04                  	shr	bl, 4
  2013 00000D8A 8A83[CD540000]          	mov	al, [ebx+hex_chars]
  2014 00000D90 A2[63550000]            	mov	[msgNabmBar], al
  2015                                  
  2016                                  	; 24/11/2016
  2017 00000D95 30E4                    	xor	ah, ah
  2018 00000D97 A0[94550000]            	mov	al, [ac97_int_ln_reg]
  2019 00000D9C B10A                    	mov	cl, 10
  2020 00000D9E F6F1                    	div	cl
  2021 00000DA0 660105[6F550000]        	add	[msgIRQ], ax
  2022 00000DA7 20C0                    	and	al, al
  2023 00000DA9 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  2024 00000DAB A0[70550000]            	mov	al, [msgIRQ+1]
  2025 00000DB0 B420                    	mov	ah, ' '
  2026 00000DB2 66A3[6F550000]          	mov	[msgIRQ], ax
  2027                                  _w_ac97imsg_:
  2028                                  	; EBX = Message address
  2029                                  	; ECX = Max. message length (or stop on ZERO character)
  2030                                  	;	(1 to 255)
  2031                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  2032                                       	sys 	_msg, msgAC97Info, 255, 07h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000DB8 BB[DE540000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000DBD B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000DC2 BA07000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000DC7 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000DCC CD40                <1>  int 40h
  2033 00000DCE C3                              retn
  2034                                  
  2035                                  ;=============================================================================
  2036                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
  2037                                  ;=============================================================================
  2038                                  
  2039                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2040                                  
  2041                                  ;-----------------------------------------------------------------------------
  2042                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
  2043                                  ;-----------------------------------------------------------------------------
  2044                                  	; 22/10/2017
  2045                                  setgraphmode:
  2046                                  	;pushad
  2047 00000DCF 66B81200                	mov	ax,0012h
  2048                                  	;int	10h
  2049 00000DD3 CD31                    	int 	31h
  2050 00000DD5 66BAC003                	mov	dx,3C0h
  2051 00000DD9 30C0                    	xor	al,al
  2052                                  setgraphmodel0:
  2053                                  	;out	dx,al
  2054 00000DDB B401                    	mov	ah, 1 ; outb
  2055 00000DDD CD34                    	int	34h
  2056                                  	;out	dx, al
  2057                                  	;mov	ah, 1
  2058 00000DDF CD34                    	int	34h
  2059 00000DE1 FEC0                    	inc	al
  2060 00000DE3 3C10                    	cmp	al, 10h
  2061 00000DE5 72F4                    	jb	short setgraphmodel0
  2062 00000DE7 B020                    	mov	al, 20h
  2063                                  	;out	dx, al
  2064                                  	;mov	ah, 1
  2065 00000DE9 CD34                    	int	34h
  2066                                  	;popad
  2067 00000DEB C3                      	retn
  2068                                  
  2069                                  ;-----------------------------------------------------------------------------
  2070                                  ; settextmode - restore the VGA 80x25x16 text mode
  2071                                  ;-----------------------------------------------------------------------------
  2072                                  	; 22/10/2017
  2073                                  settextmode:
  2074                                  	;pushad
  2075 00000DEC 66B80300                	mov	ax, 0003h
  2076                                  	;int	10h
  2077 00000DF0 CD31                    	int	31h
  2078                                  	;popad
  2079 00000DF2 C3                      	retn
  2080                                  
  2081                                  ;-----------------------------------------------------------------------------
  2082                                  ; drawscopes - draw the track voices sample scopes
  2083                                  ; In:
  2084                                  ;  ESI = (current) sample buffer
  2085                                  ;-----------------------------------------------------------------------------
  2086                                  	; 29/10/2017
  2087                                  	; 28/10/2017
  2088                                  	; (ESI = Current DMA buffer offset)
  2089                                  	; 27/10/2017
  2090                                  	; 26/10/2017
  2091                                  	; 23/10/2017
  2092                                  drawscopes:
  2093                                  	;pushad
  2094                                    	;mov	esi, g_buff
  2095                                  	;mov	esi, edx
  2096 00000DF3 31C9                    	xor     ecx, ecx	
  2097 00000DF5 31D2                    	xor     edx, edx
  2098 00000DF7 31FF                    	xor	edi, edi
  2099                                  drawscope0:
  2100 00000DF9 66AD                    	lodsw
  2101 00000DFB 80F480                  	xor	ah, 80h
  2102 00000DFE 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  2103 00000E01 66D1E3                  	shl	bx, 1
  2104 00000E04 668B83[D0D80000]        	mov	ax, [RowOfs+ebx]
  2105 00000E0B 668987[D0DA0000]        	mov	[NewScope_L+edi], ax
  2106 00000E12 30FF                    	xor	bh, bh
  2107 00000E14 66AD                    	lodsw
  2108 00000E16 80F480                  	xor	ah, 80h
  2109 00000E19 88E3                    	mov	bl, ah	; Right Channel
  2110 00000E1B 66D1E3                  	shl	bx, 1
  2111 00000E1E 668B83[D0D80000]        	mov	ax, [RowOfs+ebx]
  2112 00000E25 668987[D0DC0000]        	mov	[NewScope_R+edi], ax
  2113 00000E2C 6683C702                	add	di, 2
  2114 00000E30 FEC1                    	inc	cl
  2115 00000E32 75C5                    	jnz	short drawscope0	
  2116                                  
  2117 00000E34 66BAC403                        mov	dx, 3C4h
  2118                                          ;mov	ax, 0802h
  2119                                          ;out	dx, ax
  2120 00000E38 66BB0208                        mov	bx, 0802h
  2121 00000E3C B403                    	mov	ah, 3 ; outw
  2122 00000E3E CD34                    	int	34h
  2123 00000E40 66BACE03                	mov	dx, 3CEh
  2124 00000E44 B008                            mov	al, 08h
  2125                                         ;out	dx, al
  2126 00000E46 B401                            mov	ah, 1 ; outb
  2127 00000E48 CD34                    	int	34h
  2128 00000E4A 6642                    	inc	dx
  2129                                  
  2130                                  	; 26/10/2017
  2131 00000E4C 31F6                            xor	esi, esi
  2132                                         ;xor	edi, edi
  2133 00000E4E BB45060A00                      mov     ebx, 0A0645h
  2134                                  drawscopel4:
  2135 00000E53 B080                            mov     al, 80h
  2136                                  drawscopel2:
  2137 00000E55 50                              push    eax ; *
  2138 00000E56 52                              push    edx ; **
  2139                                  	;out	dx, al
  2140 00000E57 B401                    	mov	ah, 1 ; outb
  2141 00000E59 CD34                    	int	34h
  2142                                  
  2143 00000E5B B4FF                            mov	ah, 0FFh
  2144                                          ;mov	ecx, 32
  2145 00000E5D B120                    	mov	cl, 32
  2146 00000E5F 28C0                    	sub     al, al
  2147                                  drawscopel3:
  2148                                  	; 23/10/2017
  2149 00000E61 668B96[D0DE0000]                mov	dx, [OldScope_L+esi]
  2150 00000E68 663B96[D0DA0000]                cmp	dx, [NewScope_L+esi]
  2151 00000E6F 7414                            je	short drawscopef3
  2152 00000E71 88041A                          mov	[edx+ebx], al ; L
  2153 00000E74 668B96[D0DA0000]                mov     dx, [NewScope_L+esi]
  2154 00000E7B 88241A                  	mov	[edx+ebx], ah ; L
  2155 00000E7E 668996[D0DE0000]                mov     [OldScope_L+esi], dx
  2156                                  drawscopef3:
  2157                                  	; 27/10/2017
  2158 00000E85 668B96[D0E00000]                mov	dx, [OldScope_R+esi]
  2159 00000E8C 663B96[D0DC0000]                cmp	dx, [NewScope_R+esi]
  2160 00000E93 7416                            je	short drawscopef4
  2161 00000E95 88441A26                	mov	[edx+ebx+38], al ; R
  2162 00000E99 668B96[D0DC0000]                mov     dx, [NewScope_R+esi]
  2163 00000EA0 88641A26                        mov	[edx+ebx+38], ah ; R
  2164 00000EA4 668996[D0E00000]                mov     [OldScope_R+esi], dx
  2165                                  drawscopef4:
  2166 00000EAB 83C610                  	add	esi, 2*8
  2167 00000EAE 43                      	inc	ebx
  2168 00000EAF E2B0                    	loop    drawscopel3
  2169                                  
  2170 00000EB1 5A                              pop     edx ; **
  2171 00000EB2 58                              pop     eax ; *
  2172 00000EB3 81EEFE010000            	sub	esi, 2*256-2
  2173 00000EB9 83EB20                  	sub	ebx, 32
  2174 00000EBC D0E8                            shr     al, 1
  2175 00000EBE 7595                            jnz	short drawscopel2
  2176                                  	;popad
  2177 00000EC0 C3                              retn
  2178                                  
  2179                                  ;=============================================================================
  2180                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  2181                                  ;=============================================================================
  2182                                  
  2183                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2184                                  
  2185                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  2186                                  
  2187                                  ;-----------------------------------------------------------------------------
  2188                                  ; EQUATES AND STRUCTURES
  2189                                  ;-----------------------------------------------------------------------------
  2190                                  
  2191                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  2192                                  ID_ILBM equ 4D424C49h
  2193                                  ID_BMHD equ 44484D42h
  2194                                  ID_CMAP equ 50414D43h
  2195                                  ID_BODY equ 59444F42h
  2196                                  
  2197                                  struc Form			; IFF/ILBM header file format
  2198 00000000 ????????                  .ID:		resd 1
  2199 00000004 ????????                  .Length:	resd 1
  2200 00000008 ????????                  .Type:	resd 1
  2201                                    .size:
  2202                                  endstruc
  2203                                  
  2204                                  struc Chunk			; IFF/ILBM header chunk format
  2205 00000000 ????????                  .ID:		resd 1
  2206 00000004 ????????                  .Length:	resd 1
  2207                                    .size:	
  2208                                  endstruc
  2209                                  
  2210                                  struc BMHD			; IFF/ILBM BMHD chunk format
  2211 00000000 ????                      .Width: 	resw 1
  2212 00000002 ????                      .Height:	resw 1
  2213 00000004 ????                      .PosX:	resw 1
  2214 00000006 ????                      .PosY:	resw 1
  2215 00000008 ??                        .Planes:	resb 1
  2216 00000009 ??                        .Masking:	resb 1
  2217 0000000A ??                        .Compression:	resb 1
  2218 0000000B ??                        .Pad:		resb 1
  2219 0000000C ????                      .Transparent:	resw 1
  2220 0000000E ??                        .AspectX	resb 1
  2221 0000000F ??                        .AspectY:	resb 1
  2222 00000010 ????                      .PageWidth:	resw 1
  2223 00000012 ????                      .PageHeight:	resw 1
  2224                                    .size:	
  2225                                  endstruc
  2226                                  
  2227                                  struc CMAP			; IFF/ILBM CMAP chunk format
  2228 00000000 <res 300h>                .Colors:	resb 768
  2229                                    .size:	
  2230                                  endstruc
  2231                                  
  2232                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  2233                                  
  2234                                  ;------------------------------------------------------------------------------
  2235                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  2236                                  ;         a value in little/big endian form to big/little endian form.
  2237                                  ;------------------------------------------------------------------------------
  2238                                  %macro	bswap   1
  2239                                          xchg    al, ah
  2240                                          rol     eax, 16
  2241                                          xchg    al, ah
  2242                                  %endmacro
  2243                                  
  2244                                  ;------------------------------------------------------------------------------
  2245                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  2246                                  ; In:
  2247                                  ;  ESI = IFF/ILBM image file address
  2248                                  ;------------------------------------------------------------------------------
  2249                                  putlbm:
  2250 00000EC1 60                              pushad
  2251                                  
  2252                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  2253                                  
  2254 00000EC2 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  2255 00000EC8 7551                            jne     short putlbmd0
  2256 00000ECA 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  2257 00000ED1 7548                            jne     short putlbmd0
  2258                                  
  2259                                  ; get the IFF/ILBM file length in bytes
  2260                                  
  2261 00000ED3 8B4604                          mov     eax, [esi+Form.Length]
  2262                                          bswap   eax
  2239 00000ED6 86E0                <1>  xchg al, ah
  2240 00000ED8 C1C010              <1>  rol eax, 16
  2241 00000EDB 86E0                <1>  xchg al, ah
  2263 00000EDD 89C1                            mov     ecx, eax
  2264                                  
  2265                                  ; decrease the file length and updates the file pointer
  2266                                  
  2267 00000EDF 83E904                          sub     ecx, 4
  2268 00000EE2 83C60C                          add     esi, Form.size
  2269                                  
  2270                                  ; IFF/ILBM main parser body loop
  2271                                  
  2272                                  putlbml0:
  2273 00000EE5 85C9                            test    ecx, ecx
  2274 00000EE7 7E64                            jle     short putlbmd1
  2275                                  
  2276                                  ; get the next chunk ID and length in bytes
  2277                                  
  2278 00000EE9 8B1E                            mov     ebx, [esi+Chunk.ID]
  2279 00000EEB 8B4604                          mov     eax, [esi+Chunk.Length]
  2280                                          bswap   eax
  2239 00000EEE 86E0                <1>  xchg al, ah
  2240 00000EF0 C1C010              <1>  rol eax, 16
  2241 00000EF3 86E0                <1>  xchg al, ah
  2281 00000EF5 93                              xchg    ebx, eax
  2282 00000EF6 83C608                          add     esi, Chunk.size
  2283                                  
  2284                                  ; word align the chunk length and decrease the file length counter
  2285                                  
  2286 00000EF9 43                              inc     ebx
  2287 00000EFA 80E3FE                          and     bl, 0FEh ; ~1
  2288 00000EFD 83E908                          sub     ecx, Chunk.size
  2289 00000F00 29D9                            sub     ecx, ebx
  2290                                  
  2291                                  ; check for the BMHD/CMAP/BODY chunk headers
  2292                                  
  2293 00000F02 3D424D4844                      cmp     eax, ID_BMHD
  2294 00000F07 7415                            je      short putlbmf0
  2295 00000F09 3D434D4150                      cmp     eax, ID_CMAP
  2296 00000F0E 7440                            je      short putlbmf1
  2297 00000F10 3D424F4459                      cmp     eax, ID_BODY
  2298 00000F15 7455                            je      short putlbmf2
  2299                                  
  2300                                  ; advance to the next IFF/ILBM chunk structure
  2301                                  
  2302                                  putlbmc0:
  2303 00000F17 01DE                            add     esi, ebx
  2304 00000F19 EBCA                            jmp     short putlbml0
  2305                                  
  2306                                  putlbmd0:
  2307 00000F1B F9                              stc
  2308 00000F1C 61                              popad
  2309 00000F1D C3                              retn
  2310                                  
  2311                                  ; process the BMHD bitmap header chunk
  2312                                  
  2313                                  putlbmf0:
  2314 00000F1E 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  2315 00000F22 75F7                            jne     short putlbmd0
  2316 00000F24 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  2317 00000F28 75F1                            jne     short putlbmd0
  2318 00000F2A 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  2319 00000F2E 75EB                            jne     short putlbmd0
  2320 00000F30 0FB706                          movzx   eax, word [esi+BMHD.Width]
  2321 00000F33 86E0                            xchg    al, ah
  2322 00000F35 83C007                          add     eax, 7
  2323 00000F38 C1E803                          shr     eax, 3
  2324 00000F3B A3[7C550000]                    mov     [picture.width], eax
  2325 00000F40 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  2326 00000F44 86E0                            xchg    al, ah
  2327 00000F46 A3[80550000]                    mov     [picture.height], eax
  2328 00000F4B EBCA                            jmp     short putlbmc0
  2329                                  
  2330                                  putlbmd1:
  2331 00000F4D F8                              clc
  2332 00000F4E 61                              popad
  2333 00000F4F C3                              retn
  2334                                  
  2335                                  ; process the CMAP colormap chunk
  2336                                  
  2337                                  putlbmf1:
  2338 00000F50 66BAC803                        mov     dx, 3C8h
  2339 00000F54 30C0                            xor     al, al
  2340                                          ;out	dx, al
  2341 00000F56 B401                    	mov	ah, 1 ; outb
  2342 00000F58 CD34                    	int	34h
  2343 00000F5A 6642                            inc     dx
  2344                                  putlbml1:
  2345 00000F5C 8A06                            mov     al, [esi]
  2346 00000F5E C0E802                          shr     al, 2
  2347                                          ;out	dx, al
  2348                                  	;mov	ah, 1 ; outb
  2349 00000F61 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2350 00000F63 46                              inc     esi
  2351 00000F64 4B                              dec     ebx
  2352 00000F65 7FF5                            jg      short putlbml1
  2353 00000F67 E979FFFFFF                      jmp     putlbml0
  2354                                  
  2355                                  ; process the BODY bitmap body chunk
  2356                                  
  2357                                  putlbmf2:
  2358 00000F6C 60                              pushad
  2359 00000F6D BF00000A00                      mov     edi, 0A0000h
  2360                                          ;cld
  2361 00000F72 66BACE03                        mov     dx, 3CEh
  2362                                          ;mov	ax, 0FF08h
  2363                                          ;out	dx, ax
  2364 00000F76 66BB08FF                	mov	bx, 0FF08h
  2365 00000F7A B403                    	mov	ah, 3 ; outw
  2366 00000F7C CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2367 00000F7E 66BAC403                        mov     dx, 3C4h
  2368 00000F82 B002                            mov     al, 02h
  2369                                          ;out	dx, al
  2370 00000F84 B401                    	mov	ah, 1 ; outb
  2371 00000F86 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2372 00000F88 6642                            inc     dx
  2373 00000F8A 8B0D[80550000]                  mov     ecx, [picture.height]
  2374                                  putlbml2:
  2375 00000F90 51                              push    ecx
  2376 00000F91 B011                            mov     al, 11h
  2377                                  putlbml3:
  2378 00000F93 50                              push    eax
  2379 00000F94 57                              push    edi
  2380                                          ;out	dx, al
  2381 00000F95 B401                    	mov	ah, 1 ; outb
  2382 00000F97 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2383 00000F99 8B1D[7C550000]                  mov     ebx, [picture.width]
  2384                                  putlbml4:
  2385 00000F9F AC                              lodsb
  2386 00000FA0 84C0                            test    al, al
  2387 00000FA2 7C0A                            jl      short putlbmf3
  2388 00000FA4 0FB6C8                          movzx   ecx, al
  2389 00000FA7 41                              inc     ecx
  2390 00000FA8 29CB                            sub     ebx, ecx
  2391 00000FAA F3A4                            rep     movsb
  2392 00000FAC EB0B                            jmp     short putlbmc4
  2393                                  putlbmf3:
  2394 00000FAE F6D8                            neg     al
  2395 00000FB0 0FB6C8                          movzx   ecx, al
  2396 00000FB3 41                              inc     ecx
  2397 00000FB4 29CB                            sub     ebx, ecx
  2398 00000FB6 AC                              lodsb
  2399 00000FB7 F3AA                            rep     stosb
  2400                                  putlbmc4:
  2401 00000FB9 85DB                            test    ebx, ebx
  2402 00000FBB 7FE2                            jg      short putlbml4
  2403 00000FBD 5F                              pop     edi
  2404 00000FBE 58                              pop     eax
  2405 00000FBF 00C0                            add     al, al
  2406 00000FC1 73D0                            jnc     short putlbml3
  2407 00000FC3 83C750                          add     edi, 80
  2408 00000FC6 59                              pop     ecx
  2409 00000FC7 E2C7                            loop    putlbml2
  2410 00000FC9 61                      	popad
  2411 00000FCA E948FFFFFF                      jmp	putlbmc0
  2412                                  
  2413                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  2414                                  ;------------------------------------------------------------------------------
  2415                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  2416                                  ;  ESI = IFF/ILBM image file address
  2417                                  ;------------------------------------------------------------------------------
  2418                                  
  2419                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  2420                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  2421                                  ;       MODStopModule();
  2422                                  ;       MODFreeModule(Song);
  2423                                  ;       return;
  2424                                  ;   }
  2425                                  ;   setgraphmode();
  2426                                  ;   putlbm(Logo);
  2427                                  ;   while (!kbhit())
  2428                                  ;       drawscopes(Song->NumTracks);
  2429                                  ;   settextmode();
  2430                                  ;   free(Logo);
  2431                                  ;   MODStopModule();
  2432                                  ;   MODFreeModule(Song);
  2433                                  
  2434                                  ;loadlbm:
  2435                                  ;	; ebx = ASCIIZ file name address
  2436                                  ;	; ecx = open mode (0 = open for read)	
  2437                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  2438                                  ;	jc	short loadlbm_retn
  2439                                  ;
  2440                                  ;	mov     [LBM_FileHandle], eax
  2441                                  ;
  2442                                  ;	; get file size by moving file pointer to the end of file
  2443                                  ;	; ebx = file handle/number
  2444                                  ;	; ecx : offset = 0
  2445                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  2446                                  ;	sys	_seek, eax, 0, 2
  2447                                  ;	jc	short loadlbm_cf
  2448                                  ;
  2449                                  ;	mov	[LBM_FileSize], eax
  2450                                  ;
  2451                                  ;	; move file pointer to the beginning of the file
  2452                                  ;	; ecx = 0
  2453                                  ;	; edx = 0
  2454                                  ;	;xor	ecx, ecx
  2455                                  ; 	xor	dl, dl
  2456                                  ;	; ebx = [LBM_FileHandle]
  2457                                  ;	sys	_seek
  2458                                  ;	;jc	short loadlbm_cf
  2459                                  ;
  2460                                  ;	; ebx = File handle
  2461                                  ;	; ecx = Buffer address
  2462                                  ;	; edx = Byte count
  2463                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  2464                                  ;	mov	ecx, LOGO_ADDRESS
  2465                                  ;	mov	edx, [LBM_FileSize]
  2466                                  ;	sys	_read
  2467                                  ;	jc	short loadlbm_cf
  2468                                  ;
  2469                                  ;	cmp	eax, edx  ; read count = file size ?
  2470                                  ;	;jb	short loadlbm_cf		 
  2471                                  ;loadlbm_cf:
  2472                                  ;	pushf
  2473                                  ;	sys	_close, [LBM_FileHandle]	
  2474                                  ;	popf
  2475                                  ;loadlbm_retn:
  2476                                  ;	retn	
  2477                                  ;
  2478                                  ;LOGO_FILE_NAME:
  2479                                  ;	db	"LOGO.LBM", 0
  2480                                  
  2481                                  LOGO_ERROR_MSG:
  2482 00000FCF 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  2482 00000FD8 64696E672074686520-
  2482 00000FE1 4946462F494C424D20-
  2482 00000FEA 6C6F676F2070696374-
  2482 00000FF3 75726520210D0A00   
  2483                                  
  2484 00000FFB 90                      align 2
  2485                                  ; 22/10/2017
  2486                                  LOGO_ADDRESS:
  2487                                  ;incbin "LOGO.LBM"	  	 
  2488                                  ; 27/10/2017
  2489 00000FFC <bin 4298h>             incbin "TINYPLAY.LBM"
  2490                                  
  2491                                  ;=============================================================================
  2492                                  ;               preinitialized data
  2493                                  ;=============================================================================
  2494                                  
  2495                                  ;=============================================================================
  2496                                  ; Protracker effects stuff
  2497                                  ;=============================================================================
  2498                                  
  2499                                  ;-----------------------------------------------------------------------------
  2500                                  ; Effect jump tables
  2501                                  ;-----------------------------------------------------------------------------
  2502                                  
  2503                                  align 4
  2504                                  
  2505                                  efxtable:
  2506 00005294 [C7070000]              	dd      efxarpeggio	; 0 - arpeggio
  2507 00005298 [F4040000]              	dd      efxnull		; 1 - porta up
  2508 0000529C [F4040000]              	dd      efxnull		; 2 - porta down
  2509 000052A0 [12070000]              	dd      efxtoneporta	; 3 - tone porta
  2510 000052A4 [21070000]              	dd      efxvibrato	; 4 - vibrato
  2511 000052A8 [F4040000]              	dd      efxnull		; 5 - tone+slide
  2512 000052AC [F4040000]              	dd      efxnull		; 6 - vibrato+slide
  2513 000052B0 [3E080000]              	dd      efxtremolo	; 7 - tremolo
  2514 000052B4 [F4040000]              	dd      efxnull		; 8 - unused
  2515 000052B8 [49070000]              	dd      efxsampoffset	; 9 - sample offset
  2516 000052BC [F4040000]              	dd      efxnull		; A - volume slide
  2517 000052C0 [55070000]              	dd      efxpattjump	; B - pattern jump
  2518 000052C4 [63070000]              	dd      efxsetvolume	; C - set volume
  2519 000052C8 [71070000]              	dd      efxbreak	; D - break pattern
  2520 000052CC [F4040000]              	dd      efxnull		; E - extra effects
  2521 000052D0 [90070000]              	dd      efxsetspeed	; F - set speed
  2522                                  
  2523                                  efxtable2:
  2524 000052D4 [F5040000]              	dd      efxarpeggio2	; 0 - arpeggio
  2525 000052D8 [17050000]              	dd      efxportaup	; 1 - porta up
  2526 000052DC [3D050000]              	dd      efxportadown	; 2 - porta down
  2527 000052E0 [64050000]              	dd      efxtoneporta2	; 3 - tone porta
  2528 000052E4 [9D050000]              	dd      efxvibrato2	; 4 - vibrato
  2529 000052E8 [F9050000]              	dd      efxtoneslide	; 5 - tone+slide
  2530 000052EC [06060000]              	dd      efxvibslide	; 6 - vibrato+slide
  2531 000052F0 [2D060000]              	dd      efxtremolo2	; 7 - tremolo
  2532 000052F4 [F4040000]              	dd      efxnull		; 8 - unused
  2533 000052F8 [F4040000]              	dd      efxnull		; 9 - sample offset
  2534 000052FC [10060000]              	dd      efxvolslide	; A - volume slide
  2535 00005300 [F4040000]              	dd      efxnull		; B - pattern jump
  2536 00005304 [F4040000]              	dd      efxnull		; C - set volume
  2537 00005308 [F4040000]              	dd      efxnull		; D - break pattern
  2538 0000530C [F4040000]              	dd      efxnull		; E - extra effects
  2539 00005310 [F4040000]              	dd      efxnull		; F - set speed
  2540                                  
  2541                                  ;-----------------------------------------------------------------------------
  2542                                  ; Amiga period table
  2543                                  ;-----------------------------------------------------------------------------
  2544                                  
  2545                                  ;PeriodTable0:	
  2546                                  ;	dw	0
  2547                                  PeriodTable:
  2548 00005314 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  2548 0000531D 0A000A7009E8086808-
  2548 00005326 F00780071407       
  2549 0000532C B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  2549 00005335 050005B80474043404-
  2549 0000533E F803C0038A03       
  2550 00005344 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  2550 0000534D 0280025C023A021A02-
  2550 00005356 FC01E001C501       
  2551 0000535C AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  2551 00005365 0140012E011D010D01-
  2551 0000536E FE00F000E200       
  2552 00005374 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  2552 0000537D 00A00097008F008700-
  2552 00005386 7F0078007100       
  2553 0000538C 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  2553 00005395 0050004B0047004300-
  2553 0000539E 3F003C003800       
  2554 000053A4 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  2554 000053AD 002800250023002100-
  2554 000053B6 1F001E001C00       
  2555                                  
  2556                                  ;-----------------------------------------------------------------------------
  2557                                  ; Sinus wave table
  2558                                  ;-----------------------------------------------------------------------------
  2559                                  
  2560                                  SinTable:
  2561 000053BC 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  2561 000053C5 C5D4E1             
  2562 000053C8 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  2562 000053D1 E1                 
  2563 000053D2 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  2563 000053DB 19                 
  2564                                  
  2565                                  ;=============================================================================
  2566                                  ;               PLAY.ASM - DATA
  2567                                  ;=============================================================================
  2568 000053DC 00                      	db	0
  2569                                  msg_usage:
  2570 000053DD 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2570 000053E6 506C6179657220666F-
  2570 000053EF 72205452444F532033-
  2570 000053F8 383620627920457264-
  2570 00005401 6F67616E2054616E2E-
  2570 0000540A 20                 
  2571                                  	;;db	'October 2017.',10,13
  2572                                  	;db	'June 2024.',10,13
  2573 0000540B 446563656D62657220-     	db	'December 2024',10,13
  2573 00005414 323032340A0D       
  2574 0000541A 75736167653A20746D-     	db	'usage: tmodplay filename.mod', 10,13,0
  2574 00005423 6F64706C6179206669-
  2574 0000542C 6C656E616D652E6D6F-
  2574 00005435 640A0D00           
  2575 00005439 32392F31302F323031-     	db	'29/10/2017',10,13,0
  2575 00005442 370A0D00           
  2576                                  	;db	'02/06/2024',10,13,0
  2577 00005446 32372F31322F323032-     	db	'27/12/2024',10,13,0
  2577 0000544F 340A0D00           
  2578                                  
  2579                                  Credits:
  2580 00005453 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2580 0000545C 506C61796572207630-
  2580 00005465 2E3162206279204361-
  2580 0000546E 726C6F732048617361-
  2580 00005477 6E2E204A756C792031-
  2580 00005480 3939332E           
  2581 00005484 0A0D00                  	db	10,13,0
  2582                                  ErrorMesg:    
  2583 00005487 4572726F72206C6F61-     	db 'Error loading Module file.',10,13,0
  2583 00005490 64696E67204D6F6475-
  2583 00005499 6C652066696C652E0A-
  2583 000054A2 0D00               
  2584                                  
  2585                                  ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0
  2586                                  ;MsgFound:    db 'Sound Blaster found at Address 2'
  2587                                  ;PortText:    db 'x0h, IRQ '
  2588                                  ;IrqText:     db 'x.',10,13,0
  2589                                  
  2590                                  trdos386_err_msg:
  2591 000054A4 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  2591 000054AD 2053797374656D2063-
  2591 000054B6 616C6C206572726F72-
  2591 000054BF 20210A0D00         
  2592                                  
  2593                                  ; 07/10/2017
  2594 000054C4 0A                      pattern_shift:	db 10
  2595                                  ;numtracks:	dw 4
  2596                                  ; 18/10/2017
  2597 000054C5 04000000                numtracks:	dd 4
  2598                                  
  2599                                  ;=============================================================================
  2600                                  ;               PLAYER.ASM - DATA
  2601                                  ;=============================================================================
  2602                                  
  2603                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  2604                                  ;bps:		db 8 ; bits per sample (8 or 16)
  2605                                  
  2606                                  ;19/10/2017
  2607 000054C9 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  2608 000054CA 10                      bps:		db 16 ; bits per sample (8 or 16)
  2609                                  
  2610                                  Sample_Rate:
  2611                                  MixSpeed:	;dw 22050 ; Hz
  2612                                  		; 02/06/2024
  2613 000054CB 80BB                    		dw 48000 ; Hz
  2614                                  
  2615                                  ; 13/11/2016
  2616 000054CD 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2616 000054D6 3941424344454600   
  2617                                  ;
  2618                                  msgAC97Info:	
  2619 000054DE 0D0A                    		db 0Dh, 0Ah
  2620 000054E0 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2620 000054E9 6F20436F6E74726F6C-
  2620 000054F2 6C6572202620436F64-
  2620 000054FB 656320496E666F0D0A 
  2621 00005504 56656E646F72204944-     		db "Vendor ID: "
  2621 0000550D 3A20               
  2622 0000550F 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2622 00005518 6963652049443A20   
  2623 00005520 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2624 00005527 4275733A20              		db "Bus: "
  2625 0000552C 303068204465766963-     msgBusNo:	db "00h Device: "
  2625 00005535 653A20             
  2626 00005538 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2626 00005541 696F6E3A20         
  2627 00005546 303068                  msgFncNo	db "00h"
  2628 00005549 0D0A                    		db 0Dh, 0Ah
  2629 0000554B 4E414D4241523A20        		db "NAMBAR: "
  2630 00005553 30303030682020          msgNamBar	db "0000h  "
  2631 0000555A 4E41424D4241523A20      		db "NABMBAR: "
  2632 00005563 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  2632 0000556C 513A20             
  2633 0000556F 3030                    msgIRQ:		dw 3030h
  2634 00005571 0D0A00                  		db 0Dh, 0Ah, 0
  2635                                  ;
  2636                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2637                                  ;codec_id:	   dd 0
  2638                                  ;codec_chip_id:	   dd 0
  2639                                  ;codec_vendor_ids: dw 0
  2640                                  ;codec_chip_ids:   dw 0
  2641                                  
  2642                                  ;dword_str:	dd 30303030h, 30303030h
  2643                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2644                                  
  2645                                  ;=============================================================================
  2646                                  ;        	uninitialized data
  2647                                  ;=============================================================================
  2648                                  
  2649                                  bss_start:
  2650                                  
  2651                                  ABSOLUTE bss_start
  2652                                  
  2653                                  alignb 4
  2654                                  
  2655                                  ;------------------------------------------------------------------------------
  2656                                  ; IFF/ILBM DATA
  2657                                  ;------------------------------------------------------------------------------
  2658                                  
  2659 00005574 ????????                LBM_FileHandle:	resd 1
  2660 00005578 ????????                LBM_FileSize:	resd 1
  2661                                  ;
  2662 0000557C ????????                picture.width:	resd 1 		; current picture width and height
  2663 00005580 ????????                picture.height:	resd 1
  2664                                  
  2665                                  ;------------------------------------------------------------------------------
  2666                                  
  2667 00005584 ????????                dev_vendor:	resd 1
  2668 00005588 ????????                bus_dev_fn:	resd 1
  2669 0000558C ????????                stats_cmd:	resd 1
  2670 00005590 ????                    ac97_NamBar:	resw 1
  2671 00005592 ????                    ac97_NabmBar:	resw 1
  2672 00005594 ??                      ac97_int_ln_reg: resb 1
  2673 00005595 ??                      srb:		resb 1
  2674                                  
  2675                                  ; MODLOAD.ASM
  2676 00005596 ????????                FileHandle:	resd 1
  2677 0000559A <res 43Ch>              Header:		resb ModHeader.size
  2678                                  
  2679                                  ; MODPLAY.ASM
  2680                                  ;MixSpeed:	    resw 1
  2681                                  
  2682                                  ModInfo:
  2683 000059D6 ??                      ModInfo.OrderLen:   resb 1
  2684 000059D7 ??                      ModInfo.ReStart:    resb 1
  2685 000059D8 <res 80h>               ModInfo.Order:	    resb 128
  2686 00005A58 ????????                ModInfo.Patterns:   resd 1
  2687                                  
  2688 00005A5C <res 3Eh>               ModInfo.SampOfs:    resw 31
  2689 00005A9A <res 3Eh>               ModInfo.SampSeg:    resw 31
  2690 00005AD8 <res 3Eh>               ModInfo.SampLen:    resw 31
  2691 00005B16 <res 3Eh>               ModInfo.SampRep:    resw 31
  2692 00005B54 <res 3Eh>               ModInfo.SampRepLen: resw 31
  2693 00005B92 <res 3Eh>               ModInfo.SampVol:    resw 31
  2694                                  
  2695                                  ; MODPLAY.ASM
  2696                                  PitchTable:	;resw 857
  2697 00005BD0 <res 1AC2h>             		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2698 00007692 <res 4100h>             VolTable:	resb 16640
  2699 0000B792 <res 1FECh>             MixBuffer       resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2700                                  
  2701                                  ; MODPLAY.ASM
  2702 0000D77E ??                      OrderPos:	resb 1
  2703 0000D77F ??                      Tempo:		resb 1
  2704 0000D780 ??                      TempoWait:	resb 1
  2705 0000D781 ??                      Bpm:		resb 1
  2706 0000D782 ??                      Row:		resb 1
  2707 0000D783 ??                      BreakRow:	resb 1
  2708 0000D784 ????                    BpmSamples:	resw 1
  2709 0000D786 ????????                BufPtr:		resd 1
  2710 0000D78A ????                    BufLen:		resw 1
  2711 0000D78C ????????                BufRep:		resd 1
  2712 0000D790 ????????                Note:		resd 1
  2713                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2714                                  ; 07/10/2017
  2715 0000D794 <res 130h>              Tracks:		resb TrackInfo.size*8
  2716                                  
  2717 0000D8C4 <res Ch>                alignb 16
  2718                                  
  2719                                  ; PLAY.ASM
  2720                                  ;Scope:		resw 320
  2721 0000D8D0 <res 200h>              RowOfs:		resw 256
  2722                                  
  2723                                  ; 23/10/2017
  2724 0000DAD0 <res 200h>              NewScope_L:	resw 256
  2725 0000DCD0 <res 200h>              NewScope_R:	resw 256
  2726 0000DED0 <res 200h>              OldScope_L:	resw 256
  2727 0000E0D0 <res 200h>              OldScope_R:	resw 256
  2728                                  
  2729                                  ; 27/12/2024
  2730 0000E2D0 ????????                timerticks:	resd 1
  2731                                  
  2732                                  mod_file_name:
  2733 0000E2D4 <res 50h>               		resb 80
  2734                                  
  2735                                  ; 20/10/2017 (modplay7.s, SB16)
  2736                                  ; 19/10/2017 (modplay6.s, AC97)
  2737 0000E324 ??                      pan_shift:	resb 1
  2738 0000E325 ??                      volume_level:	resb 1
  2739                                  
  2740 0000E326 <res CDAh>              alignb 4096
  2741                                  
  2742                                  Audio_Buffer:
  2743 0000F000 <res 8000h>             		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2744                                  ;temp_buffer:
  2745                                  ;		;resb BUFFERSIZE / 4 ; 8192
  2746                                  ;		resb BUFFERSIZE / 2 ; 17/10/2017
  2747                                  
  2748 00017000 <res 9000h>             alignb 65536
  2749                                  
  2750                                  DMA_Buffer:
  2751 00020000 <res 10000h>            		resb 65536	
  2752                                  file_buffer:
  2753 00030000 <res 60000h>            		resb 65536*6
  2754                                  EOF:
