     1                                  ; ****************************************************************************
     2                                  ; playmod5.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; PLAYMOD5.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 05/03/2017
     7                                  ;
     8                                  ; [ Last Modification: 15/10/2017 ]
     9                                  ;
    10                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    11                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    12                                  ;
    13                                  ; Modified by using the source code of 'tinyply4.s' ('TINYPLY4.PRG') 
    14                                  ; by Erdogan Tan (06/10/2017)
    15                                  ;
    16                                  ; Modified from 'wavplay2.s' (11/06/2017)
    17                                  ;
    18                                  ; Modified from 'TINYPLAY.PRG' ('tinyplay.s') source code by Erdogan Tan
    19                                  ;			                     (05/03/2017)
    20                                  ;
    21                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    22                                  ;				      (04/03/2017) 
    23                                  ; Assembler: NASM 2.11
    24                                  ; ----------------------------------------------------------------------------
    25                                  ;	   nasm  playmod.s -l playmod.txt -o PLAYMOD.PRG	
    26                                  ; ****************************************************************************
    27                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    28                                  ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    29                                  
    30                                  ; 01/03/2017
    31                                  ; 16/10/2016
    32                                  ; 29/04/2016
    33                                  ; TRDOS 386 system calls (temporary list!)
    34                                  _ver 	equ 0
    35                                  _exit 	equ 1
    36                                  _fork 	equ 2
    37                                  _read 	equ 3
    38                                  _write	equ 4
    39                                  _open	equ 5
    40                                  _close 	equ 6
    41                                  _wait 	equ 7
    42                                  _creat 	equ 8
    43                                  _link 	equ 9
    44                                  _unlink	equ 10
    45                                  _exec	equ 11
    46                                  _chdir	equ 12
    47                                  _time 	equ 13
    48                                  _mkdir 	equ 14
    49                                  _chmod	equ 15
    50                                  _chown	equ 16
    51                                  _break	equ 17
    52                                  _stat	equ 18
    53                                  _seek	equ 19
    54                                  _tell 	equ 20
    55                                  _mount	equ 21
    56                                  _umount	equ 22
    57                                  _setuid	equ 23
    58                                  _getuid	equ 24
    59                                  _stime	equ 25
    60                                  _quit	equ 26	
    61                                  _intr	equ 27
    62                                  _fstat	equ 28
    63                                  _emt 	equ 29
    64                                  _mdate 	equ 30
    65                                  _video 	equ 31
    66                                  _audio	equ 32
    67                                  _timer	equ 33
    68                                  _sleep	equ 34
    69                                  _msg    equ 35
    70                                  _geterr	equ 36
    71                                  _fpsave	equ 37
    72                                  _pri	equ 38
    73                                  _rele	equ 39
    74                                  _fff	equ 40
    75                                  _fnf	equ 41
    76                                  _alloc	equ 42
    77                                  _dalloc equ 43
    78                                  _calbac equ 44		
    79                                  
    80                                  %macro sys 1-4
    81                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    82                                      ; 03/09/2015	
    83                                      ; 13/04/2015
    84                                      ; Retro UNIX 386 v1 system call.	
    85                                      %if %0 >= 2   
    86                                          mov ebx, %2
    87                                          %if %0 >= 3    
    88                                              mov ecx, %3
    89                                              %if %0 = 4
    90                                                 mov edx, %4   
    91                                              %endif
    92                                          %endif
    93                                      %endif
    94                                      mov eax, %1
    95                                      ;int 30h
    96                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    97                                  %endmacro
    98                                  
    99                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   100                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   101                                  
   102                                  ;; 19/06/2017
   103                                  ;BUFFERSIZE equ 2*32768 ; 25/06/2017
   104                                  BUFFERSIZE equ 32768 ; 09/10/2017
   105                                  
   106                                  ; ----------------------------------------------------------------------------
   107                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   108                                  ;	July 14th, 1993.
   109                                  
   110                                  ;=============================================================================
   111                                  ;  
   112                                  ;=============================================================================
   113                                  
   114                                  [BITS 32]
   115                                  [org 0]
   116                                  
   117                                  Start:
   118                                  	; clear bss
   119 00000000 B9[00000900]            	mov	ecx, EOF
   120 00000005 BF[E30F0000]            	mov	edi, bss_start
   121 0000000A 29F9                    	sub	ecx, edi
   122 0000000C D1E9                    	shr	ecx, 1
   123 0000000E 31C0                    	xor	eax, eax
   124 00000010 F366AB                  	rep	stosw
   125                                  
   126                                  	; Detect (& Enable) VT8233 Audio Device
   127 00000013 E846020000              	call    DetectVT8233
   128 00000018 731B                    	jnc     short GetFileName
   129                                  
   130                                  _dev_not_ready:
   131                                  ; couldn't find the audio device!
   132                                  	sys	_msg, noDevMsg, 255, 0Fh
   132                              <1> 
   132                              <1> 
   132                              <1> 
   132                              <1> 
   132                              <1>  %if %0 >= 2
   132 0000001A BB[6B020000]        <1>  mov ebx, %2
   132                              <1>  %if %0 >= 3
   132 0000001F B9FF000000          <1>  mov ecx, %3
   132                              <1>  %if %0 = 4
   132 00000024 BA0F000000          <1>  mov edx, %4
   132                              <1>  %endif
   132                              <1>  %endif
   132                              <1>  %endif
   132 00000029 B823000000          <1>  mov eax, %1
   132                              <1> 
   132 0000002E CD40                <1>  int 40h
   133 00000030 E908020000                      jmp     Exit
   134                                  
   135                                  GetFileName:  
   136 00000035 89E6                    	mov	esi, esp
   137 00000037 AD                      	lodsd
   138 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   139                                  		; (program file name & mod file name)
   140 0000003B 0F8205020000            	jb	pmsg_usage ; nothing to do
   141                                  
   142 00000041 AD                      	lodsd ; program file name address 
   143 00000042 AD                      	lodsd ; mod file name address (file to be read)
   144 00000043 89C6                    	mov	esi, eax
   145 00000045 BF[42830000]            	mov	edi, mod_file_name
   146                                  ScanName:       
   147 0000004A AC                      	lodsb
   148 0000004B 84C0                    	test	al, al
   149 0000004D 0F84F3010000            	je	pmsg_usage
   150 00000053 3C20                    	cmp	al, 20h
   151 00000055 74F3                    	je	short ScanName	; scan start of name.
   152 00000057 AA                      	stosb
   153 00000058 B4FF                    	mov	ah, 0FFh
   154                                  a_0:	
   155 0000005A FEC4                    	inc	ah
   156                                  a_1:
   157 0000005C AC                      	lodsb
   158 0000005D AA                      	stosb
   159 0000005E 3C2E                    	cmp	al, '.'
   160 00000060 74F8                    	je	short a_0	
   161 00000062 20C0                    	and	al, al
   162 00000064 75F6                    	jnz	short a_1
   163                                  
   164 00000066 08E4                    	or	ah, ah		; if period NOT found,
   165 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   166                                  SetExt:
   167 0000006A 4F                      	dec	edi
   168 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   169 00000071 C6470400                	mov	byte [edi+4], 0
   170                                  PrintMesg:      
   171                                  	; Prints the Credits Text.
   172                                  	sys	_msg, Credits, 255, 0Fh
   172                              <1> 
   172                              <1> 
   172                              <1> 
   172                              <1> 
   172                              <1>  %if %0 >= 2
   172 00000075 BB[550F0000]        <1>  mov ebx, %2
   172                              <1>  %if %0 >= 3
   172 0000007A B9FF000000          <1>  mov ecx, %3
   172                              <1>  %if %0 = 4
   172 0000007F BA0F000000          <1>  mov edx, %4
   172                              <1>  %endif
   172                              <1>  %endif
   172                              <1>  %endif
   172 00000084 B823000000          <1>  mov eax, %1
   172                              <1> 
   172 00000089 CD40                <1>  int 40h
   173                                  _1:
   174                                  	; 19/06/2017
   175                                  	; Allocate Audio Buffer (for user)
   176                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   176                              <1> 
   176                              <1> 
   176                              <1> 
   176                              <1> 
   176                              <1>  %if %0 >= 2
   176 0000008B BB00020000          <1>  mov ebx, %2
   176                              <1>  %if %0 >= 3
   176 00000090 B900800000          <1>  mov ecx, %3
   176                              <1>  %if %0 = 4
   176 00000095 BA[00900000]        <1>  mov edx, %4
   176                              <1>  %endif
   176                              <1>  %endif
   176                              <1>  %endif
   176 0000009A B820000000          <1>  mov eax, %1
   176                              <1> 
   176 0000009F CD40                <1>  int 40h
   177 000000A1 0F8201010000            	jc	error_exit
   178                                  _2:
   179                                  	; Initialize Audio Device (bl = 1 -> Interrupt method)
   180                                  	sys	_audio, 0301h, 0, ac97_int_handler ; 09/10/2017
   180                              <1> 
   180                              <1> 
   180                              <1> 
   180                              <1> 
   180                              <1>  %if %0 >= 2
   180 000000A7 BB01030000          <1>  mov ebx, %2
   180                              <1>  %if %0 >= 3
   180 000000AC B900000000          <1>  mov ecx, %3
   180                              <1>  %if %0 = 4
   180 000000B1 BA[A2020000]        <1>  mov edx, %4
   180                              <1>  %endif
   180                              <1>  %endif
   180                              <1>  %endif
   180 000000B6 B820000000          <1>  mov eax, %1
   180                              <1> 
   180 000000BB CD40                <1>  int 40h
   181 000000BD 0F82E5000000            	jc	error_exit
   182                                  	
   183                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   184                                  	;sys	_audio, 0300h, 1, srb  ; 09/10/2017 
   185                                  	;jc	error_exit
   186                                  
   187                                  LoadMod:  
   188 000000C3 BF[42830000]            	mov	edi, mod_file_name
   189 000000C8 E8EB020000              	call    LoadModule		; Load the MODule...
   190                                  	; 08/10/2017
   191 000000CD 731B                    	jnc	short _3		; any error loading?
   192                                  		
   193                                  	; yes, print error and Exit.
   194                                  
   195                                  	sys	_msg, ErrorMesg, 255, 0Fh
   195                              <1> 
   195                              <1> 
   195                              <1> 
   195                              <1> 
   195                              <1>  %if %0 >= 2
   195 000000CF BB[890F0000]        <1>  mov ebx, %2
   195                              <1>  %if %0 >= 3
   195 000000D4 B9FF000000          <1>  mov ecx, %3
   195                              <1>  %if %0 = 4
   195 000000D9 BA0F000000          <1>  mov edx, %4
   195                              <1>  %endif
   195                              <1>  %endif
   195                              <1>  %endif
   195 000000DE B823000000          <1>  mov eax, %1
   195                              <1> 
   195 000000E3 CD40                <1>  int 40h
   196                                  
   197 000000E5 E953010000              	jmp     Exit
   198                                  
   199                                  _3:
   200                                  	; 10/06/2017
   201                                  	sys	_audio, 0E00h ; get audio controller info
   201                              <1> 
   201                              <1> 
   201                              <1> 
   201                              <1> 
   201                              <1>  %if %0 >= 2
   201 000000EA BB000E0000          <1>  mov ebx, %2
   201                              <1>  %if %0 >= 3
   201                              <1>  mov ecx, %3
   201                              <1>  %if %0 = 4
   201                              <1>  mov edx, %4
   201                              <1>  %endif
   201                              <1>  %endif
   201                              <1>  %endif
   201 000000EF B820000000          <1>  mov eax, %1
   201                              <1> 
   201 000000F4 CD40                <1>  int 40h
   202 000000F6 0F82AC000000            	jc	error_exit
   203                                  
   204                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   205                                  	;jne	_dev_not_ready	
   206                                  
   207                                  	; EAX = IRQ Number in AL
   208                                  	;	Audio Device Number in AH 
   209                                  	; EBX = DEV/VENDOR ID
   210                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   211                                  	; ECX = BUS/DEV/FN 
   212                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   213                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   214                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   215                                  	;      (Low word, DX = NAMBAR address)
   216                                  
   217 000000FC A2[FE0F0000]            	mov	[ac97_int_ln_reg], al
   218 00000101 891D[F00F0000]          	mov	[dev_vendor], ebx
   219 00000107 890D[F40F0000]          	mov	[bus_dev_fn], ecx
   220 0000010D 668915[FC0F0000]        	mov	[ac97_io_base], dx
   221                                    
   222 00000114 E8650A0000              	call	write_audio_dev_info 
   223                                  
   224                                  PlayNow: 
   225 00000119 E880090000              	call    StartPlaying
   226                                  
   227                                          ;; load 65536 bytes into audio buffer
   228 0000011E BF[00900000]            	mov     edi, Audio_Buffer
   229 00000123 BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes ; 09/10/2017
   230 00000128 E8F2080000              	call	GetSamples
   231 0000012D 7279                    	jc	error_exit
   232                                  
   233                                  	; 09/10/2017 (2*BUFFERSIZE, 64K)
   234                                  	; 23/06/2017 (2*65536, 128K)
   235                                  	; Map DMA buffer to user's memory space
   236                                  	sys	_audio, 0D00h, 2*BUFFERSIZE, DMA_Buffer
   236                              <1> 
   236                              <1> 
   236                              <1> 
   236                              <1> 
   236                              <1>  %if %0 >= 2
   236 0000012F BB000D0000          <1>  mov ebx, %2
   236                              <1>  %if %0 >= 3
   236 00000134 B900000100          <1>  mov ecx, %3
   236                              <1>  %if %0 = 4
   236 00000139 BA[00000200]        <1>  mov edx, %4
   236                              <1>  %endif
   236                              <1>  %endif
   236                              <1>  %endif
   236 0000013E B820000000          <1>  mov eax, %1
   236                              <1> 
   236 00000143 CD40                <1>  int 40h
   237                                  	;jc	error_exit
   238                                  
   239                                  	; Set Master Volume Level
   240                                  	sys	_audio, 0B00h, 1D1Dh
   240                              <1> 
   240                              <1> 
   240                              <1> 
   240                              <1> 
   240                              <1>  %if %0 >= 2
   240 00000145 BB000B0000          <1>  mov ebx, %2
   240                              <1>  %if %0 >= 3
   240 0000014A B91D1D0000          <1>  mov ecx, %3
   240                              <1>  %if %0 = 4
   240                              <1>  mov edx, %4
   240                              <1>  %endif
   240                              <1>  %endif
   240                              <1>  %endif
   240 0000014F B820000000          <1>  mov eax, %1
   240                              <1> 
   240 00000154 CD40                <1>  int 40h
   241                                  
   242                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   243                                  
   244                                  	; 07/10/2017
   245                                  	;mov	word [MixSpeed], 22222	; Mixing at 22 kHz
   246                                  	
   247                                  	; Start	to play
   248 00000156 A0[4B0E0000]            	mov	al, [bps]
   249 0000015B C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   250 0000015E D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   251 00000160 8A1D[4A0E0000]          	mov	bl, [stmo]
   252 00000166 FECB                    	dec	bl
   253 00000168 08C3                    	or	bl, al
   254 0000016A 668B0D[4C0E0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   255 00000171 B704                    	mov	bh, 4 ; start to play	
   256                                  	sys	_audio
   256                              <1> 
   256                              <1> 
   256                              <1> 
   256                              <1> 
   256                              <1>  %if %0 >= 2
   256                              <1>  mov ebx, %2
   256                              <1>  %if %0 >= 3
   256                              <1>  mov ecx, %3
   256                              <1>  %if %0 = 4
   256                              <1>  mov edx, %4
   256                              <1>  %endif
   256                              <1>  %endif
   256                              <1>  %endif
   256 00000173 B820000000          <1>  mov eax, %1
   256                              <1> 
   256 00000178 CD40                <1>  int 40h
   257                                  
   258                                  	; 13/10/2017
   259 0000017A BF[00900000]            	mov     edi, Audio_Buffer
   260 0000017F BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes ; 09/10/2017
   261 00000184 E896080000              	call    GetSamples
   262                                  
   263                                  	; bh = 16 : update (current) dma half buffer
   264                                  	; bl = 0  : then switch to the next half buffer
   265                                  	;sys	_audio, 1000h
   266                                  	; 14/10/2017
   267                                  	sys	_audio, 1002h ; update dma half buffer 2
   267                              <1> 
   267                              <1> 
   267                              <1> 
   267                              <1> 
   267                              <1>  %if %0 >= 2
   267 00000189 BB02100000          <1>  mov ebx, %2
   267                              <1>  %if %0 >= 3
   267                              <1>  mov ecx, %3
   267                              <1>  %if %0 = 4
   267                              <1>  mov edx, %4
   267                              <1>  %endif
   267                              <1>  %endif
   267                              <1>  %endif
   267 0000018E B820000000          <1>  mov eax, %1
   267                              <1> 
   267 00000193 CD40                <1>  int 40h
   268                                  
   269                                  	;mov	byte [srb], 0  ; 14/10/2017
   270                                  	    
   271                                  	;; SETUP SIGNAL RESPONSE BYTE
   272                                  	;; 06/03/2017
   273                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   274                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   275                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   276                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   277                                  	;sys	_calbac
   278                                  	;jc	short error_exit
   279                                  
   280                                  	; 06/10/2017
   281                                  
   282                                  	; DIRECT CGA MEMORY ACCESS
   283                                  	; bl = 0, bh = 4
   284                                  	; Direct access/map to CGA memory (0B8000h)
   285                                  
   286                                  	sys	_video, 0400h
   286                              <1> 
   286                              <1> 
   286                              <1> 
   286                              <1> 
   286                              <1>  %if %0 >= 2
   286 00000195 BB00040000          <1>  mov ebx, %2
   286                              <1>  %if %0 >= 3
   286                              <1>  mov ecx, %3
   286                              <1>  %if %0 = 4
   286                              <1>  mov edx, %4
   286                              <1>  %endif
   286                              <1>  %endif
   286                              <1>  %endif
   286 0000019A B81F000000          <1>  mov eax, %1
   286                              <1> 
   286 0000019F CD40                <1>  int 40h
   287 000001A1 3D00800B00              	cmp	eax, 0B8000h
   288 000001A6 7418                    	je	short _a3
   289                                  error_exit:
   290                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   290                              <1> 
   290                              <1> 
   290                              <1> 
   290                              <1> 
   290                              <1>  %if %0 >= 2
   290 000001A8 BB[A60F0000]        <1>  mov ebx, %2
   290                              <1>  %if %0 >= 3
   290 000001AD B9FF000000          <1>  mov ecx, %3
   290                              <1>  %if %0 = 4
   290 000001B2 BA0E000000          <1>  mov edx, %4
   290                              <1>  %endif
   290                              <1>  %endif
   290                              <1>  %endif
   290 000001B7 B823000000          <1>  mov eax, %1
   290                              <1> 
   290 000001BC CD40                <1>  int 40h
   291 000001BE EB7D                    	jmp	short Exit
   292                                  
   293                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   294                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   295                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   296                                  ;       second, or the module will sound "looped".
   297                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   298                                  ;       the polling is called from my routine, and then the irq 0 must be
   299                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   300                                  ;       samples played by the Sound Blaster. Note that some samples are
   301                                  ;       discarded in the next code, just for fun!
   302                                  
   303                                  _a3:
   304                                  	; 02/10/2017
   305                                  	; Print "Playing..." message.
   306                                  	sys	_msg, PlayMsg, 255, 0Fh
   306                              <1> 
   306                              <1> 
   306                              <1> 
   306                              <1> 
   306                              <1>  %if %0 >= 2
   306 000001C0 BB[C60F0000]        <1>  mov ebx, %2
   306                              <1>  %if %0 >= 3
   306 000001C5 B9FF000000          <1>  mov ecx, %3
   306                              <1>  %if %0 = 4
   306 000001CA BA0F000000          <1>  mov edx, %4
   306                              <1>  %endif
   306                              <1>  %endif
   306                              <1>  %endif
   306 000001CF B823000000          <1>  mov eax, %1
   306                              <1> 
   306 000001D4 CD40                <1>  int 40h
   307                                  	; Get current cursor position
   308 000001D6 B403                    	mov	ah, 3
   309 000001D8 B700                    	mov	bh, 0 ; Video Page 0
   310 000001DA CD31                    	int	31h
   311                                  	; dh = row, dl = column
   312                                  	; 06/10/2017 (scroll check on next line)
   313 000001DC 80FE18                  	cmp	dh, 24 ; the last row
   314 000001DF 7202                    	jb	short set_bar_pos
   315 000001E1 FECE                    	dec	dh
   316                                  set_bar_pos:
   317 000001E3 B050                    	mov	al, 80
   318 000001E5 F6E6                    	mul	dh
   319 000001E7 30F6                    	xor	dh, dh
   320 000001E9 6601D0                  	add	ax, dx
   321 000001EC 66D1E0                  	shl	ax, 1
   322 000001EF BB00800B00              	mov	ebx, 0B8000h
   323 000001F4 6601C3                  	add	bx, ax
   324 000001F7 891D[E40F0000]          	mov	[bar_start], ebx
   325 000001FD 6683C320                	add	bx, 2*16
   326 00000201 891D[E80F0000]          	mov	[bar_stop], ebx
   327                                  
   328                                  	; Print (GoTo) NextLine.
   329                                  	sys	_msg, NextLine, 3, 07h
   329                              <1> 
   329                              <1> 
   329                              <1> 
   329                              <1> 
   329                              <1>  %if %0 >= 2
   329 00000207 BB[DD0F0000]        <1>  mov ebx, %2
   329                              <1>  %if %0 >= 3
   329 0000020C B903000000          <1>  mov ecx, %3
   329                              <1>  %if %0 = 4
   329 00000211 BA07000000          <1>  mov edx, %4
   329                              <1>  %endif
   329                              <1>  %endif
   329                              <1>  %endif
   329 00000216 B823000000          <1>  mov eax, %1
   329                              <1> 
   329 0000021B CD40                <1>  int 40h
   330                                  	;
   331                                  
   332 0000021D E8A4000000              	call	ModPlay ; 13/02/2017
   333                                  
   334                                  _s_exit:
   335 00000222 E826090000              	call	StopPlaying	; STOP!
   336                                  
   337                                  	; 02/10/2017
   338                                  	; Print "OK." message.
   339                                  	sys	_msg, OkMsg, 255, 0Fh
   339                              <1> 
   339                              <1> 
   339                              <1> 
   339                              <1> 
   339                              <1>  %if %0 >= 2
   339 00000227 BB[DA0F0000]        <1>  mov ebx, %2
   339                              <1>  %if %0 >= 3
   339 0000022C B9FF000000          <1>  mov ecx, %3
   339                              <1>  %if %0 = 4
   339 00000231 BA0F000000          <1>  mov edx, %4
   339                              <1>  %endif
   339                              <1>  %endif
   339                              <1>  %endif
   339 00000236 B823000000          <1>  mov eax, %1
   339                              <1> 
   339 0000023B CD40                <1>  int 40h
   340                                  Exit:           
   341                                  	;call    FreeModule	; Free MODule core.
   342                                  	
   343                                  	sys 	_exit	; Bye !
   343                              <1> 
   343                              <1> 
   343                              <1> 
   343                              <1> 
   343                              <1>  %if %0 >= 2
   343                              <1>  mov ebx, %2
   343                              <1>  %if %0 >= 3
   343                              <1>  mov ecx, %3
   343                              <1>  %if %0 = 4
   343                              <1>  mov edx, %4
   343                              <1>  %endif
   343                              <1>  %endif
   343                              <1>  %endif
   343 0000023D B801000000          <1>  mov eax, %1
   343                              <1> 
   343 00000242 CD40                <1>  int 40h
   344                                  here:
   345 00000244 EBFE                    	jmp	short here
   346                                  
   347                                  pmsg_usage:
   348                                  	sys	_msg, msg_usage, 255, 0Fh
   348                              <1> 
   348                              <1> 
   348                              <1> 
   348                              <1> 
   348                              <1>  %if %0 >= 2
   348 00000246 BB[EE0E0000]        <1>  mov ebx, %2
   348                              <1>  %if %0 >= 3
   348 0000024B B9FF000000          <1>  mov ecx, %3
   348                              <1>  %if %0 = 4
   348 00000250 BA0F000000          <1>  mov edx, %4
   348                              <1>  %endif
   348                              <1>  %endif
   348                              <1>  %endif
   348 00000255 B823000000          <1>  mov eax, %1
   348                              <1> 
   348 0000025A CD40                <1>  int 40h
   349 0000025C EBDF                    	jmp	short Exit
   350                                  
   351                                  DetectVT8233:
   352                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   353                                          sys	_audio, 0103h
   353                              <1> 
   353                              <1> 
   353                              <1> 
   353                              <1> 
   353                              <1>  %if %0 >= 2
   353 0000025E BB03010000          <1>  mov ebx, %2
   353                              <1>  %if %0 >= 3
   353                              <1>  mov ecx, %3
   353                              <1>  %if %0 = 4
   353                              <1>  mov edx, %4
   353                              <1>  %endif
   353                              <1>  %endif
   353                              <1>  %endif
   353 00000263 B820000000          <1>  mov eax, %1
   353                              <1> 
   353 00000268 CD40                <1>  int 40h
   354 0000026A C3                      	retn
   355                                  
   356                                  noDevMsg:
   357 0000026B 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   357 00000274 61626C6520746F2066-
   357 0000027D 696E64205649412056-
   357 00000286 543832333320626173-
   357 0000028F 656420617564696F20-
   357 00000298 646576696365210D0A-
   357 000002A1 00                 
   358                                  
   359                                  ac97_int_handler: ; 14/10/2017
   360                                  	; 09/10/2017
   361                                  	
   362                                  	; 19/06/2017
   363 000002A2 C605[FF0F0000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   364                                  
   365                                  	; 14/10/2017
   366 000002A9 BF[00900000]            	mov     edi, Audio_Buffer
   367 000002AE BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes
   368 000002B3 E867070000              	call    GetSamples
   369                                  
   370                                  	sys	_rele ; return from callback service 
   370                              <1> 
   370                              <1> 
   370                              <1> 
   370                              <1> 
   370                              <1>  %if %0 >= 2
   370                              <1>  mov ebx, %2
   370                              <1>  %if %0 >= 3
   370                              <1>  mov ecx, %3
   370                              <1>  %if %0 = 4
   370                              <1>  mov edx, %4
   370                              <1>  %endif
   370                              <1>  %endif
   370                              <1>  %endif
   370 000002B8 B827000000          <1>  mov eax, %1
   370                              <1> 
   370 000002BD CD40                <1>  int 40h
   371                                  	; we must not come here !
   372                                  	sys	_exit
   372                              <1> 
   372                              <1> 
   372                              <1> 
   372                              <1> 
   372                              <1>  %if %0 >= 2
   372                              <1>  mov ebx, %2
   372                              <1>  %if %0 >= 3
   372                              <1>  mov ecx, %3
   372                              <1>  %if %0 = 4
   372                              <1>  mov edx, %4
   372                              <1>  %endif
   372                              <1>  %endif
   372                              <1>  %endif
   372 000002BF B801000000          <1>  mov eax, %1
   372                              <1> 
   372 000002C4 CD40                <1>  int 40h
   373                                  
   374                                  ;=============================================================================
   375                                  ;      
   376                                  ;=============================================================================
   377                                  
   378                                  ModPlay:
   379                                  	; 14/10/2017
   380                                  	; 13/10/2017
   381                                  	; 06/10/2017, 09/10/2017
   382                                  	; 19/06/2017, 21/06/2017, 23/06/2017
   383                                  
   384                                  	; 05/03/2017 (TRDOS 386)
   385                                  	; 28/11/2016, 08/12/2016, 13/02/2017, 14/02/2017
   386                                  
   387 000002C6 66C70500800B00314E      mov word [0B8000h], 4E31h
   388                                  
   389                                  p_loop:
   390 000002CF 803D[FF0F0000]00        	cmp	byte [srb], 0
   391 000002D6 7607                    	jna	short q_loop
   392 000002D8 C605[FF0F0000]00        	mov	byte [srb], 0
   393                                  
   394                                  ;modp_gs:
   395                                  ;	mov     edi, Audio_Buffer
   396                                  ;	mov	ebx, BUFFERSIZE ; 65536 bytes ; 25/06/2017
   397                                  ;	call    GetSamples
   398                                  q_loop:
   399 000002DF B401                    	mov     ah, 1		; any key pressed?
   400 000002E1 CD32                    	int     32h		; no, Loop.
   401 000002E3 743F                    	jz	short r_loop
   402                                  
   403 000002E5 B400                    	mov     ah, 0		; flush key buffer...
   404 000002E7 CD32                    	int     32h
   405                                  
   406                                  	; 09/10/2017
   407 000002E9 3C2B                    	cmp	al, '+' ; increase sound volume
   408 000002EB 7405                    	je	short inc_volume_level
   409 000002ED 3C2D                    	cmp	al, '-'
   410 000002EF 7424                    	je	short dec_volume_level
   411                                  q_return:
   412 000002F1 C3                      	retn
   413                                  
   414                                  	; 09/10/2017 (playmod5.s)
   415                                  	; 24/06/2017 (wavplay2.s)
   416                                  inc_volume_level:
   417 000002F2 8A0D[92830000]          	mov	cl, [volume_level]
   418 000002F8 80F91F                  	cmp	cl, 1Fh ; 31
   419 000002FB 73E2                    	jnb	short q_loop
   420 000002FD FEC1                    	inc	cl
   421                                  change_volume_level:
   422 000002FF 880D[92830000]          	mov	[volume_level], cl
   423 00000305 88CD                    	mov	ch, cl
   424                                  	; Set Master Volume Level
   425                                  	sys	_audio, 0B00h
   425                              <1> 
   425                              <1> 
   425                              <1> 
   425                              <1> 
   425                              <1>  %if %0 >= 2
   425 00000307 BB000B0000          <1>  mov ebx, %2
   425                              <1>  %if %0 >= 3
   425                              <1>  mov ecx, %3
   425                              <1>  %if %0 = 4
   425                              <1>  mov edx, %4
   425                              <1>  %endif
   425                              <1>  %endif
   425                              <1>  %endif
   425 0000030C B820000000          <1>  mov eax, %1
   425                              <1> 
   425 00000311 CD40                <1>  int 40h
   426 00000313 EBCA                    	jmp	short q_loop
   427                                  dec_volume_level:
   428 00000315 8A0D[92830000]          	mov	cl, [volume_level]
   429 0000031B 80F901                  	cmp	cl, 1 ; 1
   430 0000031E 76BF                    	jna	short q_loop
   431 00000320 FEC9                    	dec	cl
   432 00000322 EBDB                    	jmp	short change_volume_level
   433                                  
   434                                  r_loop:
   435                                  	; 08/10/2017
   436 00000324 66FF05[B6030000]        	inc	word [counter]
   437 0000032B 75A2                    	jnz	short p_loop ; 09/10/2017
   438                                  BarLoop:
   439                                  	; Get Current DMA buffer Pointer 
   440                                  	; 23/06/2017
   441                                  	; bh = 15, get current pointer (DMA buffer offset)
   442                                  	; bl = 0, for PCM OUT
   443                                  	; ecx = 0
   444                                  	;
   445                                  	sys	_audio, 0F00h, 0
   445                              <1> 
   445                              <1> 
   445                              <1> 
   445                              <1> 
   445                              <1>  %if %0 >= 2
   445 0000032D BB000F0000          <1>  mov ebx, %2
   445                              <1>  %if %0 >= 3
   445 00000332 B900000000          <1>  mov ecx, %3
   445                              <1>  %if %0 = 4
   445                              <1>  mov edx, %4
   445                              <1>  %endif
   445                              <1>  %endif
   445                              <1>  %endif
   445 00000337 B820000000          <1>  mov eax, %1
   445                              <1> 
   445 0000033C CD40                <1>  int 40h
   446                                  
   447                                  	; 06/10/2017
   448 0000033E BE[00000200]            	mov	esi, DMA_Buffer
   449 00000343 01C6                    	add     esi, eax	; add offset value
   450                                      
   451                                  	; 02/10/2017 
   452 00000345 8B0D[E80F0000]          	mov     ecx, [bar_stop]	; get previous bar stop address
   453 0000034B 8B3D[E40F0000]          	mov	edi, [bar_start]
   454                                  	; 06/10/2017
   455 00000351 66B80007                	mov	ax, 0700h ; Blank
   456 00000355 668907                  	mov	[edi], ax
   457 00000358 29F9                    	sub	ecx, edi
   458 0000035A 761E                    	jna	short check_volume
   459 0000035C 89FA                    	mov	edx, edi
   460 0000035E D0E9                    	shr	cl, 1
   461 00000360 F366AB                  	rep	stosw
   462 00000363 89D7                    	mov	edi, edx
   463 00000365 8B15[EC0F0000]          	mov	edx, [prev_max]
   464 0000036B 09D2                    	or	edx, edx
   465 0000036D 740B                    	jz	short check_volume
   466 0000036F 39FA                    	cmp	edx, edi
   467 00000371 7607                    	jna	short check_volume
   468 00000373 B0DB                    	mov	al, 0DBh ; 219 ; Block
   469 00000375 B40C                    	mov	ah, 0Ch ; Light Red
   470 00000377 668902                  	mov	[edx], ax
   471                                  check_volume:
   472                                  	; 06/10/2017
   473 0000037A 8A06                    	mov	al, [esi]
   474 0000037C C0E804                  	shr	al, 4 ; al = 0 to 15
   475 0000037F 742A                    	jz	short update_bar_stop
   476 00000381 88C1                    	mov	cl, al
   477                                  draw_bar:
   478 00000383 B0DB                    	mov	al, 0DBh ; 219 ; Block
   479 00000385 B40A                    	mov	ah, 0Ah ; Light Green
   480 00000387 F366AB                  	rep	stosw
   481 0000038A 89FA                    	mov	edx, edi
   482 0000038C 4A                      	dec	edx
   483 0000038D 4A                      	dec	edx	
   484 0000038E 3B15[EC0F0000]          	cmp	edx, [prev_max]
   485 00000394 7508                    	jne	short new_max_volume
   486 00000396 890D[EC0F0000]          	mov	[prev_max], ecx ; 0 ; *
   487                                  	;jmp	short blank_prev_max
   488 0000039C EB0D                    	jmp	short update_bar_stop
   489                                  new_max_volume:	 
   490 0000039E B40C                    	mov	ah, 0Ch ; Light Red
   491 000003A0 668902                  	mov	[edx], ax
   492 000003A3 8715[EC0F0000]          	xchg	[prev_max], edx
   493                                  	;cmp	edx, [prev_max] ; ** not necessary ?!
   494                                  	;ja	short update_bar_stop ; **  not necessary ?!
   495                                  blank_prev_max:
   496 000003A9 890A                    	mov	[edx], ecx ; 0 ; *
   497                                  update_bar_stop:
   498 000003AB 893D[E80F0000]          	mov	[bar_stop], edi
   499                                  	;
   500 000003B1 E919FFFFFF              	jmp	p_loop
   501                                  
   502                                  counter: ; 08/10/2017
   503 000003B6 FFFF                    	dw 	65535 ; 09/10/2017
   504                                  
   505                                  ;=============================================================================
   506                                  ;               MODLOAD.ASM
   507                                  ;=============================================================================
   508                                  
   509                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   510                                  ;	July 10th, 1993.
   511                                  
   512                                  ; STRUCTURES
   513                                  
   514                                  struc ModSample
   515 00000000 <res 00000016>          .msName:	resb 22
   516 00000016 <res 00000002>          .msLength:	resw 1
   517 00000018 <res 00000001>          .msFinetune:	resb 1
   518 00000019 <res 00000001>          .msVolume:	resb 1
   519 0000001A <res 00000002>          .msRepeat:	resw 1
   520 0000001C <res 00000002>          .msRepLen:	resw 1
   521                                  .size:		; 30 bytes
   522                                  endstruc
   523                                  
   524                                  struc ModHeader
   525 00000000 <res 00000014>          .mhName:	resb 20
   526 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   527 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   528 000003B7 <res 00000001>          .mhReStart:	resb 1
   529 000003B8 <res 00000080>          .mhOrder:	resb 128
   530 00000438 <res 00000004>          .mhSign:	resw 2
   531                                  .size:		; 1084 bytes
   532                                  endstruc
   533                                  
   534                                  struc ModInfoRec
   535 00000000 <res 00000001>          .OrderLen:	resb 1
   536 00000001 <res 00000001>          .ReStart:	resb 1
   537 00000002 <res 00000080>          .Order:		resb 128
   538 00000082 <res 00000004>          .Patterns:	resd 1
   539 00000086 <res 0000003E>          .SampOfs:	resw 31
   540 000000C4 <res 0000003E>          .SampSeg:	resw 31
   541 00000102 <res 0000003E>          .SampLen:	resw 31
   542 00000140 <res 0000003E>          .SampRep:	resw 31
   543 0000017E <res 0000003E>          .SampRepLen:	resw 31
   544 000001BC <res 0000003E>          .SampVol:	resw 31
   545                                  .size:		; 506 bytes	
   546                                  endstruc
   547                                  
   548                                  ; CODE
   549                                  
   550                                  ; 06/10/2017
   551                                  ; 04/10/2017
   552                                  ; /* MOD FileFormat */
   553                                  
   554                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   555                                  ID_FLT4 equ 34544C46h ; "FLT4"
   556                                  ID_8CHN equ 4E484338h ; "8CHN"
   557                                  ID_FLT8 equ 34544C46h ; "FLT8"
   558                                  
   559                                  ; CODE
   560                                  
   561                                  LoadModule:
   562                                  	; edi = file name address
   563                                  
   564 000003B8 60                      	pushad
   565                                  
   566                                  	;call	ClearModInfo
   567                                  OpenFile:       
   568                                  	; ebx = ASCIIZ file name address
   569                                  	; ecx = open mode (0 = open for read)		
   570                                  	sys	_open, edi, 0 ; open for reading
   570                              <1> 
   570                              <1> 
   570                              <1> 
   570                              <1> 
   570                              <1>  %if %0 >= 2
   570 000003B9 89FB                <1>  mov ebx, %2
   570                              <1>  %if %0 >= 3
   570 000003BB B900000000          <1>  mov ecx, %3
   570                              <1>  %if %0 = 4
   570                              <1>  mov edx, %4
   570                              <1>  %endif
   570                              <1>  %endif
   570                              <1>  %endif
   570 000003C0 B805000000          <1>  mov eax, %1
   570                              <1> 
   570 000003C5 CD40                <1>  int 40h
   571 000003C7 0F8262010000            	jc	Failed
   572 000003CD A3[00100000]            	mov     [FileHandle], eax
   573                                  ReadHeader:
   574                                  	; ebx = File handle
   575                                  	; ecx = Buffer address
   576                                  	; edx = Byte count
   577                                  	sys	_read, [FileHandle], Header, ModHeader.size
   577                              <1> 
   577                              <1> 
   577                              <1> 
   577                              <1> 
   577                              <1>  %if %0 >= 2
   577 000003D2 8B1D[00100000]      <1>  mov ebx, %2
   577                              <1>  %if %0 >= 3
   577 000003D8 B9[04100000]        <1>  mov ecx, %3
   577                              <1>  %if %0 = 4
   577 000003DD BA3C040000          <1>  mov edx, %4
   577                              <1>  %endif
   577                              <1>  %endif
   577                              <1>  %endif
   577 000003E2 B803000000          <1>  mov eax, %1
   577                              <1> 
   577 000003E7 CD40                <1>  int 40h
   578 000003E9 0F8231010000            	jc      CloseFile
   579                                  CheckMK:  
   580                                  	; 04/10/2017
   581 000003EF A1[3C140000]            	mov	eax, [Header+ModHeader.mhSign]
   582                                        
   583 000003F4 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   584                                  	;je	short Is4chnMod
   585 000003F9 742B                    	je	short IsModFile
   586                                  CheckFLT4:
   587 000003FB 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   588                                  	;je	short Is4chnMod
   589 00000400 7424                    	je	short IsModFile
   590                                  Check8CHN:
   591 00000402 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   592 00000407 740D                    	je	short Is8chnMod
   593                                  CheckFLT8:
   594 00000409 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   595                                  	; 06/10/2017
   596 0000040E 7406                    	je	short Is8chnMod
   597 00000410 F9                      	stc
   598 00000411 E90A010000              	jmp	CloseFile
   599                                  Is8chnMod:
   600 00000416 C605[E10F0000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   601 0000041D C605[E00F0000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   602 00000424 EB00                    	jmp	short IsModFile
   603                                  ;Is4chnMod:
   604                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   605                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   606                                  
   607                                  IsModFile:
   608 00000426 A0[BA130000]            	mov     al, [Header+ModHeader.mhOrderLen]
   609 0000042B A2[40140000]            	mov     [ModInfo.OrderLen], al
   610                                  
   611 00000430 A0[BB130000]            	mov     al, [Header+ModHeader.mhReStart]
   612 00000435 3A05[BA130000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   613 0000043B 7202                    	jb      short SetReStart
   614 0000043D B07F                    	mov     al, 7Fh
   615                                  SetReStart:
   616 0000043F A2[41140000]            	mov     [ModInfo.ReStart], al
   617                                  
   618                                  	;mov	ecx, 128
   619 00000444 66B98000                	mov	cx, 128
   620 00000448 31D2                    	xor     edx, edx
   621 0000044A 31DB                    	xor     ebx, ebx
   622                                  CopyOrder:
   623 0000044C 8AB3[BC130000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   624 00000452 88B3[42140000]          	mov     [ModInfo.Order+ebx], dh
   625 00000458 38D6                    	cmp     dh, dl
   626 0000045A 7202                    	jb      short NextOrder
   627 0000045C 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   628                                  NextOrder:
   629 0000045E 43                      	inc     ebx
   630 0000045F E2EB                    	loop    CopyOrder
   631                                  AllocPatterns:  
   632 00000461 81E2FF000000            	and	edx, 0FFh
   633                                  	; 04/10/2017
   634                                  	;inx	dx  ; 12/03/2017
   635 00000467 FEC2                    	inc	dl
   636                                  	; dl = number of patterns (04/07/2017)
   637 00000469 8A0D[E00F0000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   638 0000046F D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   639                                  				     ; *2048 ; (byte count of patterns *64*8*4)
   640                                  	;
   641 00000471 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   642                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   643 00000473 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   644                                  	;
   645 00000478 890D[C2140000]          	mov	[ModInfo.Patterns], ecx
   646                                  	;
   647 0000047E 01CD                    	add	ebp, ecx ; next offset for samples
   648                                  ReadPatterns:  
   649                                  	;mov	ebx, [FileHandle] 
   650                                  	; ebx = File handle
   651                                  	; ecx = Buffer address
   652                                  	; edx = Byte count
   653                                  	sys	_read, [FileHandle]
   653                              <1> 
   653                              <1> 
   653                              <1> 
   653                              <1> 
   653                              <1>  %if %0 >= 2
   653 00000480 8B1D[00100000]      <1>  mov ebx, %2
   653                              <1>  %if %0 >= 3
   653                              <1>  mov ecx, %3
   653                              <1>  %if %0 = 4
   653                              <1>  mov edx, %4
   653                              <1>  %endif
   653                              <1>  %endif
   653                              <1>  %endif
   653 00000486 B803000000          <1>  mov eax, %1
   653                              <1> 
   653 0000048B CD40                <1>  int 40h
   654 0000048D 0F828D000000            	jc      CloseFile
   655                                  
   656                                  	; patterns have been loaded here... (04/07/2017)
   657                                  
   658 00000493 BE[18100000]            	mov	esi, Header+ModHeader.mhSamples
   659 00000498 31FF                    	xor     edi, edi
   660                                  CopySamples:
   661 0000049A 668B4616                	mov     ax, [esi+ModSample.msLength]
   662 0000049E 86C4                    	xchg    al, ah
   663 000004A0 66D1E0                  	shl     ax, 1
   664 000004A3 668987[42150000]        	mov     [ModInfo.SampLen+edi], ax
   665 000004AA 8A4619                  	mov     al, [esi+ModSample.msVolume]
   666 000004AD 30E4                    	xor     ah, ah
   667 000004AF 668987[FC150000]        	mov     [ModInfo.SampVol+edi], ax
   668 000004B6 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   669 000004BA 86C4                    	xchg    al, ah
   670 000004BC 66D1E0                  	shl     ax, 1
   671 000004BF 668987[80150000]        	mov     [ModInfo.SampRep+edi], ax
   672 000004C6 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   673 000004CA 86C4                    	xchg    al, ah
   674 000004CC 66D1E0                  	shl     ax, 1
   675 000004CF 668987[BE150000]        	mov     [ModInfo.SampRepLen+edi], ax
   676 000004D6 83C61E                  	add     esi, ModSample.size
   677 000004D9 6683C702                	add     di, 2
   678 000004DD 6683FF3E                	cmp     di, 2*31
   679 000004E1 72B7                    	jb      short CopySamples
   680                                  
   681 000004E3 31F6                    	xor     esi, esi
   682                                  AllocSamples:
   683 000004E5 0FB796[42150000]        	movzx	edx, word [ModInfo.SampLen+esi]
   684                                  	; 07/10/2017
   685                                  	;shr	dx, 4 ; ***
   686 000004EC 21D2                    	and	edx, edx
   687 000004EE 7426                    	jz      short NextSample
   688                                  	;inc	dx  ; number of paragraphs ; ***
   689                                  	;shl	dx, 4 ; ***
   690 000004F0 89E8                    	mov	eax, ebp
   691 000004F2 668986[C6140000]        	mov	[ModInfo.SampOfs+esi], ax
   692 000004F9 C1E810                  	shr	eax, 16
   693 000004FC 668986[04150000]        	mov	[ModInfo.SampSeg+esi], ax
   694 00000503 89E9                    	mov	ecx, ebp
   695 00000505 01D5                    	add	ebp, edx ; next offset for sample 
   696                                  ReadSample:
   697                                  	;mov	ebx, [FileHandle]
   698                                  	;movzx  edx, [ModInfo.SampLen+esi]
   699                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   700                                  
   701                                  	; ebx = File handle
   702                                  	; ecx = Buffer address
   703                                  	; edx = Byte count
   704                                  	sys	_read, [FileHandle]
   704                              <1> 
   704                              <1> 
   704                              <1> 
   704                              <1> 
   704                              <1>  %if %0 >= 2
   704 00000507 8B1D[00100000]      <1>  mov ebx, %2
   704                              <1>  %if %0 >= 3
   704                              <1>  mov ecx, %3
   704                              <1>  %if %0 = 4
   704                              <1>  mov edx, %4
   704                              <1>  %endif
   704                              <1>  %endif
   704                              <1>  %endif
   704 0000050D B803000000          <1>  mov eax, %1
   704                              <1> 
   704 00000512 CD40                <1>  int 40h
   705 00000514 720A                    	jc      short CloseFile
   706                                  
   707                                  NextSample:
   708 00000516 6683C602                	add     si, 2
   709 0000051A 6683FE3E                	cmp     si, 2*31
   710 0000051E 72C5                    	jb      short AllocSamples
   711                                  CloseFile:      
   712 00000520 9C                      	pushf
   713                                  	sys	_close, [FileHandle]
   713                              <1> 
   713                              <1> 
   713                              <1> 
   713                              <1> 
   713                              <1>  %if %0 >= 2
   713 00000521 8B1D[00100000]      <1>  mov ebx, %2
   713                              <1>  %if %0 >= 3
   713                              <1>  mov ecx, %3
   713                              <1>  %if %0 = 4
   713                              <1>  mov edx, %4
   713                              <1>  %endif
   713                              <1>  %endif
   713                              <1>  %endif
   713 00000527 B806000000          <1>  mov eax, %1
   713                              <1> 
   713 0000052C CD40                <1>  int 40h
   714 0000052E 9D                      	popf
   715                                  Failed:       
   716 0000052F 61                      	popad
   717 00000530 C3                      	retn
   718                                  
   719                                  ;=============================================================================
   720                                  ;               MODPLAY.ASM
   721                                  ;=============================================================================
   722                                  
   723                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   724                                  ;	July 23th, 1993.
   725                                  
   726                                  ; EQUATES
   727                                  
   728                                  ;NumTracks	equ 4 ; 06/10/2017 ([numtracks])
   729                                  DefTempo        equ 6
   730                                  DefBpm          equ 125
   731                                  MidCRate        equ 8448
   732                                  MixBufSize      equ 4096
   733                                  
   734                                  ; STRUCTURES
   735                                  
   736                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   737 00000000 <res 00000004>          .Samples:	resd 1
   738                                  ;.Position:	resw 1
   739 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   740 00000008 <res 00000002>          .Len:		resw 1
   741 0000000A <res 00000002>          .Repeat:	resw 1
   742 0000000C <res 00000002>          .RepLen:	resw 1
   743 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   744 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   745                                  ;.Error:	resb 1
   746                                  ;.Reserved:	resb 1 ; 01/10/2017
   747 00000010 <res 00000002>          .Period:	resw 1 ; Period
   748 00000012 <res 00000002>          .Pitch:		resw 1 
   749 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   750 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   751 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   752 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   753 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   754 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   755 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   756                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   757 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
   758 0000001E <res 00000006>          .Arp:		resw 3
   759 00000024 <res 00000002>          .ArpIndex:	resw 1
   760                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   761                                  endstruc
   762                                  
   763                                  ; CODE
   764                                  
   765                                  ;--------------------------------------------------------------------------
   766                                  ; updatechannel - update the track using the current effect
   767                                  ;--------------------------------------------------------------------------
   768                                  ; 
   769                                  ;--------------------------------------------------------------------------
   770                                  ; BeatTrack:  Process the next beat in one track.
   771                                  ;  In:
   772                                  ;    ds:di -  Track info Address.
   773                                  ;--------------------------------------------------------------------------
   774                                  
   775                                  ; edi = Track info address
   776                                  
   777                                  updatechannel:
   778                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   779                                  
   780 00000531 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   781                                  
   782                                  	;test   dx, dx
   783                                  	;je     short None
   784                                  	;cmp    dh, 00h
   785                                  	;je     short Arpeggio
   786                                  	;cmp    dh, 01h
   787                                  	;je     short PortUp
   788                                  	;cmp    dh, 02h
   789                                  	;je     short PortDown
   790                                  	;cmp    dh, 03h
   791                                  	;je     TonePort
   792                                  	;cmp    dh, 04h
   793                                  	;je     Vibrato
   794                                  	;cmp    dh, 05h
   795                                  	;je     PortSlide
   796                                  	;cmp    dh, 06h
   797                                  	;je     VibSlide
   798                                  	;cmp    dh, 0Ah
   799                                  	;je     VolSlide
   800                                  	;retn
   801                                  
   802 00000535 0FB6C6                  	movzx	eax, dh
   803 00000538 240F                    	and	al, 0Fh
   804 0000053A FF2485[400D0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   805                                  efxnull:
   806                                  None:           
   807 00000541 C3                      	retn
   808                                  efxarpeggio2:
   809                                  	; 01/10/2017
   810 00000542 84D2                    	test    dl, dl
   811 00000544 74FB                    	jz      short efxnull
   812                                  Arpeggio:
   813 00000546 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   814 0000054A 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   815 0000054F 66894712                	mov     [edi+TrackInfo.Pitch], ax
   816 00000553 6683C302                	add     bx, 2
   817 00000557 6683FB06                	cmp     bx, 6
   818 0000055B 7202                    	jb      short SetArpIndex
   819 0000055D 31DB                    	xor     ebx, ebx
   820                                  SetArpIndex:
   821 0000055F 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   822 00000563 C3                      	retn
   823                                  efxportaup:
   824                                  PortUp:
   825 00000564 30F6                    	xor     dh, dh
   826                                  	;mov	bx, [edi+TrackInfo.Period]
   827 00000566 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   828 0000056A 6629D3                  	sub     bx, dx
   829                                  	;cmp	bx, 113
   830 0000056D 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   831 00000571 7D04                    	jge     short NotSmall
   832                                  	;mov	bx, 113
   833 00000573 66BB1C00                	mov	bx, 28 ; 01/10/2017
   834                                  NotSmall:
   835 00000577 66895F10                	mov     [edi+TrackInfo.Period], bx
   836 0000057B 6601DB                  	add     bx, bx
   837                                  	;mov	ax, [PitchTable+bx]
   838 0000057E 668B83[3A160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   839 00000585 66894712                	mov     [edi+TrackInfo.Pitch], ax
   840 00000589 C3                      	retn
   841                                  efxportadown:
   842                                  PortDown:
   843 0000058A 30F6                    	xor     dh, dh
   844                                  	;mov	bx, [edi+TrackInfo.Period]
   845 0000058C 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   846 00000590 6601D3                  	add     bx, dx
   847 00000593 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   848                                  	;cmp	bx, 856
   849 00000598 7E04                    	jle     short NotBig
   850                                  	;mov	bx, 856
   851 0000059A 66BB600D                	mov	bx, 3424 ; 01/10/2017
   852                                  NotBig:         
   853 0000059E 66895F10                	mov     [edi+TrackInfo.Period], bx
   854 000005A2 6601DB                  	add     bx, bx
   855                                  	;mov	ax, [PitchTable+bx]
   856 000005A5 668B83[3A160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   857 000005AC 66894712                	mov     [edi+TrackInfo.Pitch], ax
   858 000005B0 C3                      	retn
   859                                  efxtoneporta2:
   860                                  TonePort:
   861 000005B1 30F6                    	xor     dh, dh
   862 000005B3 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   863                                  	;mov	bx, [edi+TrackInfo.Period]
   864 000005B7 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   865 000005BB 6639C3                  	cmp     bx, ax
   866 000005BE 7429                    	je      short NoPort
   867 000005C0 7F0D                    	jg      short PortToUp
   868                                  PortToDown:     
   869 000005C2 6601D3                  	add     bx, dx
   870 000005C5 6639C3                  	cmp     bx, ax
   871 000005C8 7E0D                    	jle     short SetPort
   872                                  FixPort:        
   873 000005CA 6689C3                  	mov     bx, ax
   874 000005CD EB08                    	jmp     short SetPort
   875                                  PortToUp:
   876 000005CF 6629D3                  	sub     bx, dx
   877 000005D2 6639C3                  	cmp     bx, ax
   878 000005D5 7CF3                    	jl      short FixPort
   879                                  SetPort:        
   880 000005D7 66895F10                	mov     [edi+TrackInfo.Period], bx
   881 000005DB 6601DB                  	add     bx, bx
   882                                  	;mov	ax, [PitchTable+bx]
   883 000005DE 668B83[3A160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   884 000005E5 66894712                	mov     [edi+TrackInfo.Pitch], ax
   885                                  NoPort:         
   886 000005E9 C3                      	retn
   887                                  efxvibrato2:
   888                                  	; 01/10/2017
   889                                  Vibrato:
   890 000005EA 88D6                    	mov     dh, dl
   891                                  	;and	dl, 0Fh
   892                                  	;shr	dh, 4
   893                                  	;shl	dh, 2
   894 000005EC 6681E20FF0              	and     dx, 0F00Fh
   895 000005F1 C0EE02                  	shr     dh, 2
   896                                  	;add	[edi+TrackInfo.VibPos], dh
   897                                  	;mov	dh, [edi+TrackInfo.VibPos]
   898                                  	;mov	bl, dh
   899 000005F4 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   900 000005F7 007719                  	add	[edi+TrackInfo.VibPos], dh
   901 000005FA 88DE                    	mov	dh, bl ; 01/10/2017
   902 000005FC C0EB02                  	shr     bl, 2
   903                                  	;and	bx, 1Fh
   904                                  	;mov	al, [SinTable+bx]
   905 000005FF 83E31F                  	and	ebx, 1Fh
   906 00000602 8A83[280E0000]          	mov	al, [SinTable+ebx]
   907 00000608 F6E2                    	mul     dl
   908                                  	;rol	ax, 1
   909                                  	;xchg	al, ah
   910                                  	;and	ah, 1
   911 0000060A 66C1E807                	shr	ax, 7
   912 0000060E 84F6                    	test    dh, dh
   913 00000610 7903                    	jns     short VibUp
   914 00000612 66F7D8                  	neg     ax
   915                                  VibUp:          
   916 00000615 66034710                	add     ax, [edi+TrackInfo.Period]
   917 00000619 6689C3                  	mov	bx, ax
   918                                  	;movzx	ebx, ax
   919 0000061C 6683FB71                	cmp     bx, 113
   920                                  	;cmp	bx, 113
   921 00000620 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   922 00000624 7D06                    	jge     short NoLoVib
   923                                  	;mov	bx, 113
   924 00000626 66BB1C00                	mov	bx, 28	; 01/10/2017
   925 0000062A EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   926                                  NoLoVib:        
   927 0000062C 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   928                                  	;cmp	bx, 856
   929 00000631 7E04                    	jle     short NoHiVib
   930                                  	;mov	bx, 856
   931 00000633 66BB600D                	mov	bx, 3424 ; 01/10/2017
   932                                  NoHiVib:        
   933 00000637 6601DB                  	add     bx, bx
   934                                  	;mov	ax, [PitchTable+bx]
   935 0000063A 668B83[3A160000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   936 00000641 66894712                	mov     [edi+TrackInfo.Pitch], ax
   937 00000645 C3                      	retn
   938                                  efxtoneslide:
   939                                  PortSlide:
   940 00000646 E812000000              	call    VolSlide
   941 0000064B 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   942 0000064E E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   943                                  efxvibslide:
   944                                  VibSlide:
   945 00000653 E805000000              	call    VolSlide
   946 00000658 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   947 0000065B EB8D                    	jmp     short Vibrato  ; efxvibrato2
   948                                  efxvolslide:
   949                                  VolSlide:
   950 0000065D 88D6                    	mov     dh, dl
   951 0000065F 80E20F                  	and     dl, 0Fh
   952 00000662 C0EE04                  	shr     dh, 4
   953 00000665 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   954 00000668 28D0                    	sub     al, dl
   955 0000066A 7D02                    	jge     short NoLoVol
   956 0000066C 30C0                    	xor     al, al
   957                                  NoLoVol:        
   958 0000066E 00F0                    	add     al, dh
   959 00000670 3C40                    	cmp     al, 64
   960 00000672 7602                    	jbe     short NoHiVol
   961 00000674 B040                    	mov     al, 64
   962                                  NoHiVol:        
   963 00000676 88470E                  	mov     [edi+TrackInfo.Volume], al
   964 00000679 C3                      	retn
   965                                  
   966                                  efxtremolo2:
   967                                  	; 01/10/2017 (TMODPLAY.ASM)
   968                                  Tremolo:
   969 0000067A 88D6                    	mov     dh, dl
   970 0000067C 6681E20FF0              	and     dx, 0F00Fh
   971 00000681 C0EE02                  	shr     dh, 2
   972 00000684 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
   973 00000687 00771B                  	add	[edi+TrackInfo.TremPos], dh
   974 0000068A 88DE                    	mov	dh, bl
   975 0000068C C0EB02                  	shr     bl, 2
   976                                  	; 01/10/2017 - TRDOS 386
   977                                  	;and	bx, 1Fh
   978 0000068F 83E31F                  	and	ebx, 1Fh 
   979                                  	;mov	al, [SinTable+bx]
   980 00000692 8A83[280E0000]          	mov     al, [SinTable+ebx]
   981 00000698 F6E2                    	mul     dl
   982 0000069A 66C1E806                	shr	ax, 6
   983 0000069E 84F6                    	test    dh, dh
   984 000006A0 7D03                    	jge	short Tremolo_1 ; efxtremolof2
   985 000006A2 66F7D8                  	neg     ax
   986                                  efxtremolof2:
   987                                  Tremolo_1:      
   988 000006A5 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
   989 000006A8 00E0                    	add     al, ah
   990 000006AA 7D02                    	jge     short Tremolo_2 ; efxtremolof3
   991 000006AC 30C0                    	xor     al, al
   992                                  efxtremolof3:
   993                                  Tremolo_2:       
   994 000006AE 3C40                    	cmp     al, 64 ; 40h
   995 000006B0 7E02                    	jle     short Tremolo_3 ; efxtremolof4
   996 000006B2 B040                    	mov     al, 64 ; 40h
   997                                  efxtremolof4:
   998                                  Tremolo_3:       
   999 000006B4 28E0                    	sub	al, ah  ; ****** 
  1000 000006B6 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1001 000006B9 C3                      	retn	
  1002                                  
  1003                                  ;--------------------------------------------------------------------------
  1004                                  ; readchannel - read the next note event from the pattern sheet
  1005                                  ;--------------------------------------------------------------------------
  1006                                  ;
  1007                                  ;--------------------------------------------------------------------------
  1008                                  ; GetTrack:   Get the next Note from a pattern.
  1009                                  ;  In:
  1010                                  ;    ds:di -  Track info Address.
  1011                                  ;    es:si -  Pattern Note Address.
  1012                                  ; Out:
  1013                                  ;    es:si -  The Next Pattern Note address.
  1014                                  ;--------------------------------------------------------------------------
  1015                                  
  1016                                  ; esi = Pattern note address
  1017                                  ; edi = Track info address
  1018                                  
  1019                                  readchannel:
  1020                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1021 000006BA 66AD                    	lodsw
  1022 000006BC 86C4                    	xchg    al, ah
  1023 000006BE 88E3                    	mov	bl, ah
  1024 000006C0 80E40F                  	and     ah, 0Fh
  1025 000006C3 6689C1                  	mov     cx, ax
  1026 000006C6 66AD                    	lodsw
  1027 000006C8 86C4                    	xchg    al, ah
  1028 000006CA 88E7                    	mov     bh, ah
  1029 000006CC 80E40F                  	and     ah, 0Fh
  1030 000006CF 6689C2                  	mov     dx, ax
  1031 000006D2 66895714                	mov     [edi+TrackInfo.Effect], dx
  1032                                  	; 01/10/2017 - TRDOS 386
  1033                                  	;and	bl, 0F0h
  1034 000006D6 81E3F0FF0000            	and	ebx, 0FFF0h
  1035 000006DC C0EF04                  	shr     bh, 4
  1036 000006DF 08FB                    	or      bl, bh
  1037 000006E1 7446                    	je      short SetPeriod
  1038                                  SetSample:
  1039 000006E3 30FF                    	xor	bh, bh
  1040                                  	;and	ebx, 0FFh
  1041 000006E5 FECB                    	dec     bl
  1042 000006E7 01DB                    	add     ebx, ebx
  1043 000006E9 668B83[FC150000]        	mov     ax, [ModInfo.SampVol+ebx]
  1044 000006F0 88470E                  	mov     [edi+TrackInfo.Volume], al
  1045 000006F3 668B83[C6140000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1046 000006FA 668907                  	mov     [edi+TrackInfo.Samples], ax
  1047 000006FD 668B83[04150000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1048 00000704 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1049 00000708 668B83[42150000]        	mov     ax, [ModInfo.SampLen+ebx]
  1050 0000070F 66894708                	mov     [edi+TrackInfo.Len], ax
  1051 00000713 668B83[80150000]        	mov     ax, [ModInfo.SampRep+ebx]
  1052 0000071A 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1053 0000071E 668B83[BE150000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1054 00000725 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1055                                  SetPeriod:      
  1056 00000729 6685C9                  	test    cx, cx
  1057 0000072C 7425                    	jz      short SetEffect
  1058                                  
  1059 0000072E 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1060                                  	
  1061 00000732 80FE03                  	cmp     dh, 03h
  1062                                  	;je	short SetEffect
  1063 00000735 7428                    	je	short efxtoneporta ; 01/10/2017
  1064                                  
  1065 00000737 66894F10                	mov     [edi+TrackInfo.Period], cx
  1066                                  	;movzx	ebx, cx
  1067 0000073B 6689CB                  	mov     bx, cx
  1068 0000073E 6601DB                  	add     bx, bx
  1069                                  	;mov	ax, [PitchTable+bx]
  1070 00000741 668B83[3A160000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1071 00000748 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1072 0000074C C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1073                                  SetEffect:
  1074                                  	;test	dx, dx
  1075                                  	;je	short InitNone
  1076                                  	;cmp	dh, 00h
  1077                                  	;je	InitArpeggio
  1078                                  	;cmp	dh, 03h
  1079                                  	;je	short InitTonePort
  1080                                  	;cmp	dh, 04h
  1081                                  	;je	short InitVibrato
  1082                                  	;cmp	dh, 09h
  1083                                  	;je	short SampleOfs
  1084                                  	;cmp	dh, 0Bh
  1085                                  	;je	short PosJump
  1086                                  	;cmp	dh, 0Ch
  1087                                  	;je	short SetVolume
  1088                                  	;cmp	dh, 0Dh
  1089                                  	;je	short Break
  1090                                  	;cmp	dh, 0Fh
  1091                                  	;je	SetSpeed
  1092                                  	;retn
  1093                                  
  1094                                  	; 01/10/2017 (TMODPLAY.ASM)
  1095                                  	
  1096                                  	; dx = [di+TrackInfo.Effect]
  1097                                  	
  1098 00000753 0FB6C6                  	movzx	eax, dh
  1099 00000756 240F                    	and	al, 0Fh
  1100 00000758 FF2485[000D0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1101                                  ;efxnull:
  1102                                  ;InitNone:
  1103                                  ;	retn
  1104                                  efxtoneporta:
  1105                                  	; 01/10/2017
  1106                                  	; cx = period
  1107                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1108                                  InitTonePort:
  1109 0000075F 84D2                    	test    dl, dl
  1110 00000761 7503                    	jnz     short SetPortParm
  1111 00000763 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1112                                  SetPortParm:    
  1113 00000766 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1114 00000769 66895714                	mov     [edi+TrackInfo.Effect], dx
  1115 0000076D C3                      	retn
  1116                                  efxvibrato:
  1117                                  InitVibrato:
  1118 0000076E 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1119 00000771 88C4                    	mov     ah, al
  1120                                  	;and	al, 0Fh
  1121                                  	;and	ah, 0F0h
  1122 00000773 66250FF0                	and	ax, 0F00Fh
  1123 00000777 F6C20F                  	test    dl, 0Fh
  1124 0000077A 7502                    	jne     short OkDepth
  1125 0000077C 08C2                    	or      dl, al
  1126                                  OkDepth:        
  1127 0000077E F6C2F0                  	test    dl, 0F0h
  1128 00000781 7502                    	jnz     short OkRate
  1129 00000783 08E2                    	or      dl, ah
  1130                                  OkRate:         
  1131 00000785 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1132 00000788 66895714                	mov     [edi+TrackInfo.Effect], dx
  1133 0000078C 6685C9                  	test    cx, cx
  1134 0000078F 7404                    	jz      short OkPos
  1135 00000791 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1136                                  OkPos:          
  1137 00000795 C3                      	retn
  1138                                  efxsampoffset:
  1139                                  	; 01/10/2017 ; *******
  1140                                  SampleOfs:         
  1141                                  ;	test    dl, dl
  1142                                  ;	jnz     short SetSampleOfs
  1143                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1144                                  ;SetSampleOfs:
  1145                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1146 00000796 88D6                    	mov     dh, dl
  1147 00000798 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1148 0000079E 895704                  	mov     [edi+TrackInfo.Position], edx
  1149 000007A1 C3                      	retn
  1150                                  efxpattjump:
  1151                                  PosJump:
  1152 000007A2 8815[FC810000]          	mov     [OrderPos], dl
  1153 000007A8 C605[00820000]40        	mov     byte [Row], 64
  1154 000007AF C3                      	retn
  1155                                  efxsetvolume:
  1156                                  SetVolume:
  1157 000007B0 80FA40                  	cmp     dl, 64
  1158 000007B3 7602                    	jbe     short OkVol
  1159 000007B5 B240                    	mov     dl, 64
  1160                                  OkVol:
  1161                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1162 000007B7 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1163                                  	;mov	[edi+TrackInfo.Volume], dl
  1164 000007B9 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1165 000007BD C3                      	retn
  1166                                  efxbreak:
  1167                                  Break:
  1168 000007BE 88D6                    	mov     dh, dl
  1169 000007C0 80E20F                  	and     dl, 0Fh
  1170 000007C3 C0EE04                  	shr     dh, 4
  1171 000007C6 00F6                    	add     dh, dh
  1172 000007C8 00F2                    	add     dl, dh
  1173 000007CA C0E602                  	shl     dh, 2
  1174 000007CD 00F2                    	add     dl, dh
  1175 000007CF 8815[01820000]          	mov     [BreakRow], dl
  1176 000007D5 C605[00820000]40        	mov     byte [Row], 64
  1177 000007DC C3                      	retn
  1178                                  efxsetspeed:
  1179                                  SetSpeed:
  1180 000007DD 84D2                    	test    dl,dl
  1181 000007DF 7432                    	je      Skip
  1182 000007E1 80FA1F                  	cmp     dl,31
  1183 000007E4 770D                    	ja      short SetBpm
  1184                                  SetTempo:       
  1185 000007E6 8815[FD810000]          	mov     [Tempo], dl
  1186 000007EC 8815[FE810000]          	mov     [TempoWait], dl
  1187 000007F2 C3                      	retn
  1188                                  SetBpm:
  1189 000007F3 8815[FF810000]          	mov     [Bpm], dl
  1190 000007F9 B067                    	mov     al, 103
  1191 000007FB F6E2                    	mul     dl
  1192 000007FD 88E3                    	mov     bl, ah
  1193 000007FF 30FF                    	xor     bh, bh
  1194 00000801 66A1[4C0E0000]          	mov     ax, [MixSpeed]
  1195 00000807 6631D2                  	xor     dx, dx
  1196 0000080A 66F7F3                  	div     bx
  1197 0000080D 66A3[02820000]          	mov     [BpmSamples], ax
  1198                                  Skip:           
  1199 00000813 C3                      	retn
  1200                                  efxarpeggio:
  1201                                  	; 01/10/2017
  1202 00000814 84D2                    	test    dl, dl
  1203                                  	;je	efxnull
  1204 00000816 74FB                    	je	short Skip
  1205                                  InitArpeggio:
  1206 00000818 88D6                    	mov     dh, dl
  1207 0000081A 80E20F                  	and     dl, 0Fh
  1208 0000081D C0EE04                  	shr     dh, 4
  1209                                  	; 01/10/2017
  1210                                  	;mov	cx, 36
  1211 00000820 66B95400                	mov	cx, 84 ; 84 notes/periods
  1212 00000824 31DB                    	xor     ebx, ebx
  1213 00000826 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1214                                  gt_ScanPeriod:
  1215                                  	;cmp	ax, [PeriodTable+bx]
  1216 0000082A 663B83[800D0000]        	cmp	ax, [PeriodTable+ebx]
  1217 00000831 7306                    	jae     short SetArp
  1218 00000833 6683C302                	add     bx, 2
  1219 00000837 E2F1                    	loop    gt_ScanPeriod
  1220                                  SetArp:         
  1221 00000839 6601D2                  	add     dx, dx
  1222 0000083C 00DE                    	add     dh, bl
  1223 0000083E 00DA                    	add     dl, bl
  1224                                  	; 01/10/2017
  1225                                  	;mov	bx, [PeriodTable+bx]
  1226 00000840 668B9B[800D0000]        	mov	bx, [PeriodTable+ebx]
  1227                                  	;add	bx, bx
  1228 00000847 01DB                    	add	ebx, ebx
  1229                                  	;mov	ax, [PitchTable+bx]
  1230 00000849 668B83[3A160000]        	mov	ax, [PitchTable+ebx]
  1231 00000850 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1232 00000854 88F3                    	mov     bl, dh
  1233 00000856 30FF                    	xor     bh, bh
  1234 00000858 668B9B[800D0000]        	mov	bx, [PeriodTable+ebx]
  1235                                  	;add	bx, bx
  1236 0000085F 01DB                    	add	ebx, ebx
  1237                                  	;mov	ax, [PitchTable+bx]
  1238 00000861 668B83[3A160000]        	mov	ax, [PitchTable+ebx]
  1239 00000868 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1240 0000086C 88D3                    	mov     bl, dl
  1241 0000086E 30FF                    	xor     bh, bh
  1242 00000870 668B9B[800D0000]        	mov	bx, [PeriodTable+ebx]
  1243                                  	;add	bx, bx
  1244 00000877 01DB                    	add	ebx, ebx
  1245                                  	;mov	ax, [PitchTable+bx]
  1246 00000879 668B83[3A160000]        	mov	ax, [PitchTable+ebx]
  1247 00000880 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1248 00000884 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1249 0000088A C3                      	retn
  1250                                  
  1251                                  efxtremolo:
  1252                                  	; 01/10/2017 (TMODPLAY.ASM)
  1253                                  InitTremolo:
  1254 0000088B 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1255 0000088E 88C4                    	mov     ah, al
  1256 00000890 66250FF0                	and     ax, 0F00Fh
  1257 00000894 F6C20F                  	test    dl, 0Fh
  1258 00000897 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1259 00000899 08C2                    	or      dl, al
  1260                                  efxtremolof0:
  1261                                  InitTremolo_1: 
  1262 0000089B F6C2F0                  	test    dl, 0F0h
  1263 0000089E 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1264 000008A0 08E2                    	or      dl, ah
  1265                                  efxtremolof1:
  1266                                  InitTremolo_2:
  1267 000008A2 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1268 000008A5 66895714                	mov     [edi+TrackInfo.Effect], dx
  1269 000008A9 C3                      	retn
  1270                                  
  1271                                  ;--------------------------------------------------------------------------
  1272                                  ; pollmodule - polls the module player
  1273                                  ;--------------------------------------------------------------------------
  1274                                  ;--------------------------------------------------------------------------
  1275                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1276                                  ;--------------------------------------------------------------------------
  1277                                  
  1278                                  pollmodule:
  1279                                  UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1280 000008AA FE0D[FE810000]          	dec     byte [TempoWait]
  1281 000008B0 7417                    	jz      short GetTracks
  1282                                  
  1283                                  	;mov	ecx, NumTracks
  1284 000008B2 0FB70D[E10F0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1285 000008B9 BF[12820000]            	mov	edi, Tracks
  1286                                  BeatTracks:
  1287 000008BE E86EFCFFFF              	call	BeatTrack	
  1288 000008C3 83C726                  	add	edi, TrackInfo.size
  1289 000008C6 E2F6                    	loop	BeatTracks
  1290 000008C8 C3                      	retn
  1291                                  GetTracks:
  1292 000008C9 A0[FD810000]            	mov     al, [Tempo]
  1293 000008CE A2[FE810000]            	mov     [TempoWait], al
  1294                                  
  1295 000008D3 8B35[0E820000]          	mov	esi, [Note]
  1296 000008D9 803D[00820000]40        	cmp     byte [Row], 64
  1297 000008E0 7268                    	jb      short NoPattWrap
  1298                                  
  1299 000008E2 8B35[C2140000]          	mov	esi, [ModInfo.Patterns]
  1300 000008E8 8A1D[FC810000]          	mov     bl, [OrderPos]
  1301 000008EE 3A1D[40140000]          	cmp     bl, [ModInfo.OrderLen]
  1302 000008F4 7214                    	jb      short NoOrderWrap
  1303 000008F6 8A1D[41140000]          	mov     bl, [ModInfo.ReStart]
  1304 000008FC 881D[FC810000]          	mov     [OrderPos], bl
  1305 00000902 3A1D[40140000]          	cmp     bl, [ModInfo.OrderLen]
  1306 00000908 7364                    	jae     short NoUpdate
  1307                                  NoOrderWrap:    
  1308                                  	;xor	bh, bh
  1309 0000090A 81E3FF000000            	and	ebx, 0FFh
  1310 00000910 8A9B[42140000]          	mov     bl, [ModInfo.Order+ebx]
  1311                                  	; 05/10/2017
  1312                                  	;shl	ebx, 10 ; *1024
  1313 00000916 8A0D[E00F0000]          	mov	cl, [pattern_shift] ; 10 or 11
  1314 0000091C D3E3                    	shl	ebx, cl ; *1024 or *2048
  1315                                  	;
  1316 0000091E 01DE                    	add     esi, ebx
  1317 00000920 8A1D[01820000]          	mov     bl, [BreakRow]
  1318 00000926 881D[00820000]          	mov     [Row], bl
  1319                                  	;xor	bh, bh
  1320 0000092C 81E3FF000000            	and	ebx, 0FFh
  1321 00000932 883D[01820000]          	mov     [BreakRow], bh ; 0
  1322 00000938 66C1E304                	shl     bx, 4
  1323 0000093C 01DE                    	add     esi, ebx
  1324 0000093E 8935[0E820000]          	mov     [Note], esi
  1325 00000944 FE05[FC810000]          	inc     byte [OrderPos]
  1326                                  NoPattWrap:     
  1327 0000094A FE05[00820000]          	inc     byte [Row]
  1328                                  
  1329                                  	;cld
  1330                                  	;mov	ecx, NumTracks
  1331 00000950 0FB70D[E10F0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1332 00000957 BF[12820000]            	mov	edi, Tracks
  1333                                  GetTracks_next:
  1334 0000095C 51                      	push	ecx	
  1335 0000095D E858FDFFFF              	call	GetTrack
  1336 00000962 59                      	pop	ecx
  1337 00000963 83C726                  	add	edi, TrackInfo.size
  1338 00000966 E2F4                    	loop	GetTracks_next
  1339                                  
  1340 00000968 8935[0E820000]          	mov     [Note], esi
  1341                                  NoUpdate:
  1342 0000096E C3                      	retn
  1343                                  
  1344                                  ;--------------------------------------------------------------------------
  1345                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1346                                  ;  In:
  1347                                  ;   ds:si -  Track Info Address.
  1348                                  ;   ds:di -  Buffer Address.
  1349                                  ;    cx   -  Buffer Size.
  1350                                  ;--------------------------------------------------------------------------
  1351                                  
  1352                                  ; esi = Track info address
  1353                                  ; edi = Buffer address
  1354                                  ; ecx = Buffer size
  1355                                  
  1356                                  MixTrack:
  1357 0000096F 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1358 00000974 7752                    	ja      short MixLooped
  1359                                  MixNonLooped:   
  1360 00000976 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1361 00000978 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1362 0000097B 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1363 0000097F 52                      	push    edx
  1364 00000980 56                      	push    esi
  1365 00000981 01D3                    	add     ebx, edx
  1366 00000983 01D5                    	add     ebp, edx
  1367 00000985 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1368                                  	; 01/10/2017
  1369                                  	;mov	al, [esi+TrackInfo.Volume]
  1370 00000989 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1371                                  	; ah = [esi+TrackInfo.VolDiff]
  1372 0000098D 00E0                    	add	al, ah ; ****** 
  1373 0000098F C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1374 00000993 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1375 00000996 89DE                    	mov     esi, ebx
  1376 00000998 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1377 0000099A 88C7                    	mov     bh, al
  1378 0000099C 88D0                    	mov     al, dl
  1379 0000099E 88F2                    	mov     dl, dh
  1380                                  	;xor	dh, dh
  1381 000009A0 81E2FF000000            	and	edx, 0FFh
  1382                                  nlMixSamp:      
  1383 000009A6 39EE                    	cmp     esi, ebp
  1384 000009A8 7311                    	jae     short nlMixBye
  1385 000009AA 8A1E                    	mov     bl, [esi]
  1386                                  	;mov	bl, [VolTable+bx]
  1387 000009AC 8A9B[FC300000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1388 000009B2 001F                    	add     [edi], bl
  1389 000009B4 47                      	inc     edi
  1390 000009B5 00C4                    	add     ah, al
  1391 000009B7 11D6                    	adc     esi, edx
  1392 000009B9 E2EB                    	loop    nlMixSamp
  1393                                  nlMixBye:       
  1394 000009BB 89F3                    	mov     ebx, esi
  1395 000009BD 5E                      	pop     esi
  1396 000009BE 5A                      	pop     edx
  1397 000009BF 29D3                    	sub     ebx, edx
  1398 000009C1 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1399 000009C4 88661D                  	mov     [esi+TrackInfo.Error], ah
  1400 000009C7 C3                      	retn
  1401                                  MixLooped:
  1402 000009C8 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1403 000009CA 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1404 000009CD 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1405 000009D1 892D[0A820000]          	mov     [BufRep], ebp
  1406                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1407 000009D7 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1408 000009DB 52                      	push    edx
  1409 000009DC 56                      	push    esi
  1410 000009DD 01D3                    	add     ebx, edx
  1411 000009DF 01D5                    	add     ebp, edx
  1412 000009E1 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1413                                  	; 01/10/2017
  1414                                  	;mov	al, [esi+TrackInfo.Volume]
  1415 000009E5 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1416                                  	; ah = [esi+TrackInfo.VolDiff]
  1417 000009E9 00E0                    	add	al, ah ; ****** 
  1418 000009EB C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1419 000009EF 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1420                                  	;mov	si, bx
  1421 000009F2 89DE                    	mov	esi, ebx ; 04/09/2017
  1422 000009F4 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1423 000009F6 88C7                    	mov     bh, al
  1424 000009F8 88D0                    	mov     al, dl
  1425 000009FA 88F2                    	mov     dl, dh
  1426                                  	;xor	dh, dh
  1427 000009FC 81E2FF000000            	and	edx, 0FFh
  1428                                  lpMixSamp:      
  1429 00000A02 39EE                    	cmp     esi, ebp
  1430 00000A04 7206                    	jb      short lpMixNow
  1431 00000A06 2B35[0A820000]          	sub     esi, [BufRep]
  1432                                  lpMixNow:       
  1433 00000A0C 8A1E                    	mov     bl, [esi]
  1434                                  	;mov	bl, [VolTable+bx]
  1435 00000A0E 8A9B[FC300000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1436 00000A14 001F                    	add     [edi], bl
  1437 00000A16 47                      	inc     edi
  1438 00000A17 00C4                    	add     ah, al
  1439 00000A19 11D6                    	adc	esi, edx
  1440 00000A1B E2E5                    	loop    lpMixSamp
  1441                                  lpMixBye:       
  1442                                  ;	mov     ebx, esi
  1443                                  ;	pop     esi
  1444                                  ;	pop     edx
  1445                                  ;	sub     ebx, edx
  1446                                  ;	mov     [esi+TrackInfo.Position], ebx
  1447                                  ;	mov     [esi+TrackInfo.Error], ah
  1448                                  ;	retn
  1449 00000A1D EB9C                    	jmp	short nlMixBye
  1450                                  
  1451                                  ;--------------------------------------------------------------------------
  1452                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1453                                  ;  In:
  1454                                  ;    Buffer  - Buffer Address.
  1455                                  ;    Count   - Buffer Size.
  1456                                  ;--------------------------------------------------------------------------
  1457                                  
  1458                                  mixpoll:
  1459                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1460                                  	; edi = buffer address
  1461                                  	; ebx = count
  1462                                  
  1463 00000A1F 60                      	pushad
  1464                                  
  1465                                  	;cld
  1466                                  NextChunk:      
  1467 00000A20 66833D[08820000]00      	cmp     word [BufLen], 0
  1468 00000A28 754A                    	jne     short CopyChunk
  1469                                  
  1470 00000A2A 53                      	push    ebx
  1471 00000A2B 57                      	push    edi
  1472                                  MixChunk:       
  1473 00000A2C BF[FC710000]            	mov	edi, MixBuffer
  1474 00000A31 0FB70D[02820000]        	movzx	ecx, word [BpmSamples]
  1475                                  	;mov	cx, [BpmSamples]
  1476 00000A38 893D[04820000]          	mov     [BufPtr], edi
  1477 00000A3E 66890D[08820000]        	mov     [BufLen], cx
  1478                                  
  1479 00000A45 B080                    	mov     al, 80h
  1480 00000A47 F3AA                    	rep     stosb
  1481                                  
  1482                                  	;mov	cx, NumTracks
  1483                                  	;mov	cl, NumTracks ; 01/10/2017
  1484 00000A49 8A0D[E10F0000]          	mov	cl, [numtracks] ; 06/10/2017
  1485 00000A4F BE[EC810000]            	mov	esi, Tracks - TrackInfo.size
  1486                                  GetSamples_next:
  1487 00000A54 51                      	push	ecx
  1488 00000A55 83C626                  	add	esi, TrackInfo.size
  1489 00000A58 668B0D[08820000]        	mov	cx, [BufLen]
  1490 00000A5F 8B3D[04820000]          	mov	edi, [BufPtr]
  1491 00000A65 E805FFFFFF              	call	MixTrack
  1492 00000A6A 59                      	pop	ecx
  1493 00000A6B E2E7                    	loop	GetSamples_next	
  1494                                  
  1495 00000A6D E838FEFFFF              	call    UpdateTracks
  1496                                  
  1497 00000A72 5F                      	pop     edi
  1498 00000A73 5B                      	pop     ebx
  1499                                  CopyChunk:      
  1500                                  	;mov	cx, [BufLen]
  1501 00000A74 0FB70D[08820000]        	movzx	ecx, word [BufLen]
  1502 00000A7B 39D9                    	cmp	ecx, ebx
  1503                                  	;cmp	cx, bx
  1504 00000A7D 7602                    	jbe     short MoveChunk
  1505                                  	;mov	cx, bx
  1506 00000A7F 89D9                    	mov     ecx, ebx
  1507                                  MoveChunk:
  1508 00000A81 8B35[04820000]          	mov     esi, [BufPtr]
  1509 00000A87 010D[04820000]          	add     [BufPtr], ecx
  1510 00000A8D 66290D[08820000]        	sub     [BufLen], cx
  1511 00000A94 29CB                    	sub     ebx, ecx
  1512 00000A96 F3A4                    	rep     movsb
  1513 00000A98 85DB                    	test    ebx, ebx
  1514 00000A9A 7584                    	jnz     short NextChunk
  1515                                  
  1516 00000A9C 61                      	popad
  1517 00000A9D C3                      	retn
  1518                                  
  1519                                  ;--------------------------------------------------------------------------
  1520                                  ; StartPlaying: Initializes the Sound System.
  1521                                  ;  In:
  1522                                  ;   Module Information Resources.
  1523                                  ;--------------------------------------------------------------------------
  1524                                  
  1525                                  StartPlaying:
  1526 00000A9E 60                      	pushad
  1527                                  SetModParms:    
  1528 00000A9F C605[FC810000]00        	mov     byte [OrderPos], 0
  1529 00000AA6 C605[FD810000]06        	mov     byte [Tempo], DefTempo
  1530 00000AAD C605[FE810000]06        	mov     byte [TempoWait], DefTempo
  1531 00000AB4 C605[FF810000]7D        	mov     byte [Bpm], DefBpm
  1532 00000ABB C605[00820000]40        	mov     byte [Row], 64
  1533 00000AC2 C605[01820000]00        	mov     byte [BreakRow], 0
  1534 00000AC9 66A1[4C0E0000]          	mov     ax, [MixSpeed]
  1535 00000ACF 31D2                    	xor     edx, edx
  1536 00000AD1 66BB3200                	mov     bx, 24*DefBpm/60
  1537 00000AD5 66F7F3                  	div     bx
  1538 00000AD8 66A3[02820000]          	mov     [BpmSamples], ax
  1539                                  ClearTracks:    
  1540 00000ADE BF[12820000]            	mov     edi, Tracks
  1541                                  	; 06/10/2017
  1542                                  	;mov	ecx, NumTracks*TrackInfo.size
  1543 00000AE3 B826000000              	mov	eax, TrackInfo.size
  1544 00000AE8 0FB70D[E10F0000]        	movzx	ecx, word [numtracks]
  1545 00000AEF F7E1                    	mul	ecx
  1546 00000AF1 89C1                    	mov	ecx, eax
  1547 00000AF3 31C0                    	xor	eax, eax
  1548                                  	;cld
  1549 00000AF5 F3AA                    	rep     stosb
  1550                                  
  1551 00000AF7 A3[04820000]            	mov     [BufPtr], eax
  1552 00000AFC 66A3[08820000]          	mov     [BufLen], ax
  1553                                  MakePitch:
  1554 00000B02 66B80021                	mov     ax, MidCRate
  1555 00000B06 66BBAC01                	mov     bx, 428
  1556 00000B0A 66F7E3                  	mul     bx
  1557 00000B0D 66F735[4C0E0000]        	div     word [MixSpeed]
  1558 00000B14 30F6                    	xor     dh, dh
  1559 00000B16 88E2                    	mov     dl, ah
  1560 00000B18 88C4                    	mov     ah, al
  1561 00000B1A 30C0                    	xor     al, al
  1562                                  	;mov	cx, 857
  1563 00000B1C 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1564 00000B20 31DB                    	xor     ebx, ebx
  1565 00000B22 BF[3A160000]            	mov     edi, PitchTable
  1566                                  PitchLoop:      
  1567 00000B27 50                      	push    eax
  1568 00000B28 52                      	push    edx
  1569 00000B29 6639DA                  	cmp     dx, bx
  1570 00000B2C 7303                    	jae     short NoDiv
  1571 00000B2E 66F7F3                  	div     bx
  1572                                  NoDiv:          
  1573 00000B31 66AB                    	stosw
  1574 00000B33 5A                      	pop     edx
  1575 00000B34 58                      	pop     eax
  1576 00000B35 43                      	inc     ebx
  1577 00000B36 E2EF                    	loop    PitchLoop
  1578                                  MakeVolume:     
  1579 00000B38 66B90041                	mov     cx, 16640
  1580 00000B3C 89CB                    	mov     ebx, ecx
  1581                                  VolLoop:
  1582 00000B3E 4B                      	dec     ebx
  1583 00000B3F 88D8                    	mov     al, bl
  1584 00000B41 F6EF                    	imul    bh
  1585 00000B43 88A3[FC300000]          	mov     [VolTable+ebx], ah
  1586 00000B49 E2F3                    	loop    VolLoop
  1587                                  
  1588 00000B4B 61                      	popad
  1589 00000B4C C3                      	retn
  1590                                  
  1591                                  ;--------------------------------------------------------------------------
  1592                                  ; StopPlaying: ShutDown the Sound System.
  1593                                  ;--------------------------------------------------------------------------
  1594                                  
  1595                                  StopPlaying:
  1596                                  	; 19/06/2017
  1597                                  	; Stop Playing
  1598                                  	sys	_audio, 0700h
  1598                              <1> 
  1598                              <1> 
  1598                              <1> 
  1598                              <1> 
  1598                              <1>  %if %0 >= 2
  1598 00000B4D BB00070000          <1>  mov ebx, %2
  1598                              <1>  %if %0 >= 3
  1598                              <1>  mov ecx, %3
  1598                              <1>  %if %0 = 4
  1598                              <1>  mov edx, %4
  1598                              <1>  %endif
  1598                              <1>  %endif
  1598                              <1>  %endif
  1598 00000B52 B820000000          <1>  mov eax, %1
  1598                              <1> 
  1598 00000B57 CD40                <1>  int 40h
  1599                                  	; Cancel callback service (for user)
  1600                                  	sys	_audio, 0900h
  1600                              <1> 
  1600                              <1> 
  1600                              <1> 
  1600                              <1> 
  1600                              <1>  %if %0 >= 2
  1600 00000B59 BB00090000          <1>  mov ebx, %2
  1600                              <1>  %if %0 >= 3
  1600                              <1>  mov ecx, %3
  1600                              <1>  %if %0 = 4
  1600                              <1>  mov edx, %4
  1600                              <1>  %endif
  1600                              <1>  %endif
  1600                              <1>  %endif
  1600 00000B5E B820000000          <1>  mov eax, %1
  1600                              <1> 
  1600 00000B63 CD40                <1>  int 40h
  1601                                  	; Deallocate Audio Buffer (for user)
  1602                                  	sys	_audio, 0A00h
  1602                              <1> 
  1602                              <1> 
  1602                              <1> 
  1602                              <1> 
  1602                              <1>  %if %0 >= 2
  1602 00000B65 BB000A0000          <1>  mov ebx, %2
  1602                              <1>  %if %0 >= 3
  1602                              <1>  mov ecx, %3
  1602                              <1>  %if %0 = 4
  1602                              <1>  mov edx, %4
  1602                              <1>  %endif
  1602                              <1>  %endif
  1602                              <1>  %endif
  1602 00000B6A B820000000          <1>  mov eax, %1
  1602                              <1> 
  1602 00000B6F CD40                <1>  int 40h
  1603                                  	; Disable Audio Device
  1604                                  	sys	_audio, 0C00h
  1604                              <1> 
  1604                              <1> 
  1604                              <1> 
  1604                              <1> 
  1604                              <1>  %if %0 >= 2
  1604 00000B71 BB000C0000          <1>  mov ebx, %2
  1604                              <1>  %if %0 >= 3
  1604                              <1>  mov ecx, %3
  1604                              <1>  %if %0 = 4
  1604                              <1>  mov edx, %4
  1604                              <1>  %endif
  1604                              <1>  %endif
  1604                              <1>  %endif
  1604 00000B76 B820000000          <1>  mov eax, %1
  1604                              <1> 
  1604 00000B7B CD40                <1>  int 40h
  1605                                  
  1606 00000B7D C3                      	retn
  1607                                  
  1608                                  ;=============================================================================
  1609                                  ; 
  1610                                  ;=============================================================================
  1611                                  
  1612                                  ;dword2str:
  1613                                  ;	; 13/11/2016 - Erdogan Tan 
  1614                                  ;	; eax = dword value
  1615                                  ;	;
  1616                                  ;	call	dwordtohex
  1617                                  ;	mov	[dword_str], edx
  1618                                  ;	mov	[dword_str+4], eax
  1619                                  ;	mov	si, dword_str
  1620                                  ;	retn
  1621                                  
  1622                                  	; 05/03/2017 (TRDOS 386)
  1623                                  	; trdos386.s (unix386.s) - 10/05/2015
  1624                                  	; Convert binary number to hexadecimal string
  1625                                  
  1626                                  ;bytetohex:
  1627                                  ;	; INPUT ->
  1628                                  ;	; 	AL = byte (binary number)
  1629                                  ;	; OUTPUT ->
  1630                                  ;	;	AX = hexadecimal string
  1631                                  ;	;
  1632                                  ;	push	ebx
  1633                                  ;	movzx	ebx, al
  1634                                  ;	shr	bl, 4
  1635                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1636                                  ;	xchg	bl, al
  1637                                  ;	and	bl, 0Fh
  1638                                  ;	mov	ah, [ebx+hex_chars] 
  1639                                  ;	pop	ebx	
  1640                                  ;	retn
  1641                                  
  1642                                  ;wordtohex:
  1643                                  ;	; INPUT ->
  1644                                  ;	; 	AX = word (binary number)
  1645                                  ;	; OUTPUT ->
  1646                                  ;	;	EAX = hexadecimal string
  1647                                  ;	;
  1648                                  ;	push	ebx
  1649                                  ;	xor	ebx, ebx
  1650                                  ;	xchg	ah, al
  1651                                  ;	push	eax
  1652                                  ;	mov	bl, ah
  1653                                  ;	shr	bl, 4
  1654                                  ;	mov	al, [ebx+hex_chars] 	 	
  1655                                  ;	mov	bl, ah
  1656                                  ;	and	bl, 0Fh
  1657                                  ;	mov	ah, [ebx+hex_chars]
  1658                                  ;	shl	eax, 16
  1659                                  ;	pop	eax
  1660                                  ;	pop	ebx
  1661                                  ;	jmp	short bytetohex
  1662                                  
  1663                                  ;dwordtohex:
  1664                                  ;	; INPUT ->
  1665                                  ;	; 	EAX = dword (binary number)
  1666                                  ;	; OUTPUT ->
  1667                                  ;	;	EDX:EAX = hexadecimal string
  1668                                  ;	;
  1669                                  ;	push	eax
  1670                                  ;	shr	eax, 16
  1671                                  ;	call	wordtohex
  1672                                  ;	mov	edx, eax
  1673                                  ;	pop	eax
  1674                                  ;	call	wordtohex
  1675                                  ;	retn
  1676                                  
  1677                                  	; 19/06/2017
  1678                                  	; 05/03/2017 (TRDOS 386)
  1679                                  	; 13/11/2016 - Erdogan Tan
  1680                                  write_audio_dev_info:
  1681                                  	; BUS/DEV/FN
  1682                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1683                                  	; DEV/VENDOR
  1684                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1685                                  
  1686 00000B7E 8B35[F00F0000]          	mov	esi, [dev_vendor]
  1687 00000B84 6689F0                  	mov	ax, si
  1688 00000B87 0FB6D8                  	movzx	ebx, al
  1689 00000B8A 88DA                    	mov	dl, bl
  1690 00000B8C 80E30F                  	and	bl, 0Fh
  1691 00000B8F 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1692 00000B95 A2[930E0000]            	mov	[msgVendorId+3], al
  1693 00000B9A 88D3                    	mov	bl, dl
  1694 00000B9C C0EB04                  	shr	bl, 4
  1695 00000B9F 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1696 00000BA5 A2[920E0000]            	mov	[msgVendorId+2], al
  1697 00000BAA 88E3                    	mov	bl, ah
  1698 00000BAC 88DA                    	mov	dl, bl
  1699 00000BAE 80E30F                  	and	bl, 0Fh
  1700 00000BB1 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1701 00000BB7 A2[910E0000]            	mov	[msgVendorId+1], al
  1702 00000BBC 88D3                    	mov	bl, dl
  1703 00000BBE C0EB04                  	shr	bl, 4
  1704 00000BC1 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1705 00000BC7 A2[900E0000]            	mov	[msgVendorId], al
  1706 00000BCC C1EE10                  	shr	esi, 16
  1707 00000BCF 6689F0                  	mov	ax, si
  1708 00000BD2 88C3                    	mov	bl, al
  1709 00000BD4 88DA                    	mov	dl, bl
  1710 00000BD6 80E30F                  	and	bl, 0Fh
  1711 00000BD9 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1712 00000BDF A2[A40E0000]            	mov	[msgDevId+3], al
  1713 00000BE4 88D3                    	mov	bl, dl
  1714 00000BE6 C0EB04                  	shr	bl, 4
  1715 00000BE9 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1716 00000BEF A2[A30E0000]            	mov	[msgDevId+2], al
  1717 00000BF4 88E3                    	mov	bl, ah
  1718 00000BF6 88DA                    	mov	dl, bl
  1719 00000BF8 80E30F                  	and	bl, 0Fh
  1720 00000BFB 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1721 00000C01 A2[A20E0000]            	mov	[msgDevId+1], al
  1722 00000C06 88D3                    	mov	bl, dl
  1723 00000C08 C0EB04                  	shr	bl, 4
  1724 00000C0B 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1725 00000C11 A2[A10E0000]            	mov	[msgDevId], al
  1726                                  
  1727 00000C16 8B35[F40F0000]          	mov	esi, [bus_dev_fn]
  1728 00000C1C C1EE08                  	shr	esi, 8
  1729 00000C1F 6689F0                  	mov	ax, si
  1730 00000C22 88C3                    	mov	bl, al
  1731 00000C24 88DA                    	mov	dl, bl
  1732 00000C26 80E307                  	and	bl, 7 ; bit 0,1,2
  1733 00000C29 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1734 00000C2F A2[C80E0000]            	mov	[msgFncNo+1], al
  1735 00000C34 88D3                    	mov	bl, dl
  1736 00000C36 C0EB03                  	shr	bl, 3
  1737 00000C39 88DA                    	mov	dl, bl
  1738 00000C3B 80E30F                  	and	bl, 0Fh
  1739 00000C3E 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1740 00000C44 A2[BA0E0000]            	mov	[msgDevNo+1], al
  1741 00000C49 88D3                    	mov	bl, dl
  1742 00000C4B C0EB04                  	shr	bl, 4
  1743 00000C4E 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1744 00000C54 A2[B90E0000]            	mov	[msgDevNo], al
  1745 00000C59 88E3                    	mov	bl, ah
  1746 00000C5B 88DA                    	mov	dl, bl
  1747 00000C5D 80E30F                  	and	bl, 0Fh
  1748 00000C60 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1749 00000C66 A2[AE0E0000]            	mov	[msgBusNo+1], al
  1750 00000C6B 88D3                    	mov	bl, dl
  1751 00000C6D C0EB04                  	shr	bl, 4
  1752 00000C70 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1753 00000C76 A2[AD0E0000]            	mov	[msgBusNo], al
  1754                                  
  1755 00000C7B 66A1[FC0F0000]          	mov	ax, [ac97_io_base]
  1756 00000C81 88C3                    	mov	bl, al
  1757 00000C83 88DA                    	mov	dl, bl
  1758 00000C85 80E30F                  	and	bl, 0Fh
  1759 00000C88 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1760 00000C8E A2[E10E0000]            	mov	[msgIOBaseAddr+3], al
  1761 00000C93 88D3                    	mov	bl, dl
  1762 00000C95 C0EB04                  	shr	bl, 4
  1763 00000C98 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1764 00000C9E A2[E00E0000]            	mov	[msgIOBaseAddr+2], al
  1765 00000CA3 88E3                    	mov	bl, ah
  1766 00000CA5 88DA                    	mov	dl, bl
  1767 00000CA7 80E30F                  	and	bl, 0Fh
  1768 00000CAA 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1769 00000CB0 A2[DF0E0000]            	mov	[msgIOBaseAddr+1], al
  1770 00000CB5 88D3                    	mov	bl, dl
  1771 00000CB7 C0EB04                  	shr	bl, 4
  1772 00000CBA 8A83[4E0E0000]          	mov	al, [ebx+hex_chars]
  1773 00000CC0 A2[DE0E0000]            	mov	[msgIOBaseAddr], al
  1774                                  
  1775                                  	; 24/11/2016
  1776 00000CC5 30E4                    	xor	ah, ah
  1777 00000CC7 A0[FE0F0000]            	mov	al, [ac97_int_ln_reg]
  1778 00000CCC B10A                    	mov	cl, 10
  1779 00000CCE F6F1                    	div	cl
  1780 00000CD0 660105[E90E0000]        	add	[msgIRQ], ax
  1781 00000CD7 20C0                    	and	al, al
  1782 00000CD9 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1783 00000CDB A0[EA0E0000]            	mov	al, [msgIRQ+1]
  1784 00000CE0 B420                    	mov	ah, ' '
  1785 00000CE2 66A3[E90E0000]          	mov	[msgIRQ], ax
  1786                                  _w_ac97imsg_:
  1787                                  	; EBX = Message address
  1788                                  	; ECX = Max. message length (or stop on ZERO character)
  1789                                  	;	(1 to 255)
  1790                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1791                                       	sys 	_msg, msgAC97Info, 255, 07h
  1791                              <1> 
  1791                              <1> 
  1791                              <1> 
  1791                              <1> 
  1791                              <1>  %if %0 >= 2
  1791 00000CE8 BB[5F0E0000]        <1>  mov ebx, %2
  1791                              <1>  %if %0 >= 3
  1791 00000CED B9FF000000          <1>  mov ecx, %3
  1791                              <1>  %if %0 = 4
  1791 00000CF2 BA07000000          <1>  mov edx, %4
  1791                              <1>  %endif
  1791                              <1>  %endif
  1791                              <1>  %endif
  1791 00000CF7 B823000000          <1>  mov eax, %1
  1791                              <1> 
  1791 00000CFC CD40                <1>  int 40h
  1792 00000CFE C3                              retn
  1793                                  
  1794                                  ;=============================================================================
  1795                                  ;               preinitialized data
  1796                                  ;=============================================================================
  1797                                  
  1798                                  ;=============================================================================
  1799                                  ; Protracker effects stuff
  1800                                  ;=============================================================================
  1801                                  
  1802                                  ;-----------------------------------------------------------------------------
  1803                                  ; Effect jump tables
  1804                                  ;-----------------------------------------------------------------------------
  1805                                  
  1806 00000CFF 90                      align 4
  1807                                  
  1808                                  efxtable:
  1809 00000D00 [14080000]              	dd      efxarpeggio	; 0 - arpeggio
  1810 00000D04 [41050000]              	dd      efxnull	; 1 - porta up
  1811 00000D08 [41050000]              	dd      efxnull	; 2 - porta down
  1812 00000D0C [5F070000]              	dd      efxtoneporta	; 3 - tone porta
  1813 00000D10 [6E070000]              	dd      efxvibrato	; 4 - vibrato
  1814 00000D14 [41050000]              	dd      efxnull		; 5 - tone+slide
  1815 00000D18 [41050000]              	dd      efxnull		; 6 - vibrato+slide
  1816 00000D1C [8B080000]              	dd      efxtremolo	; 7 - tremolo
  1817 00000D20 [41050000]              	dd      efxnull		; 8 - unused
  1818 00000D24 [96070000]              	dd      efxsampoffset	; 9 - sample offset
  1819 00000D28 [41050000]              	dd      efxnull		; A - volume slide
  1820 00000D2C [A2070000]              	dd      efxpattjump	; B - pattern jump
  1821 00000D30 [B0070000]              	dd      efxsetvolume	; C - set volume
  1822 00000D34 [BE070000]              	dd      efxbreak	; D - break pattern
  1823 00000D38 [41050000]              	dd      efxnull		; E - extra effects
  1824 00000D3C [DD070000]              	dd      efxsetspeed	; F - set speed
  1825                                  
  1826                                  efxtable2:
  1827 00000D40 [42050000]              	dd      efxarpeggio2	; 0 - arpeggio
  1828 00000D44 [64050000]              	dd      efxportaup	; 1 - porta up
  1829 00000D48 [8A050000]              	dd      efxportadown	; 2 - porta down
  1830 00000D4C [B1050000]              	dd      efxtoneporta2	; 3 - tone porta
  1831 00000D50 [EA050000]              	dd      efxvibrato2	; 4 - vibrato
  1832 00000D54 [46060000]              	dd      efxtoneslide	; 5 - tone+slide
  1833 00000D58 [53060000]              	dd      efxvibslide	; 6 - vibrato+slide
  1834 00000D5C [7A060000]              	dd      efxtremolo2	; 7 - tremolo
  1835 00000D60 [41050000]              	dd      efxnull		; 8 - unused
  1836 00000D64 [41050000]              	dd      efxnull		; 9 - sample offset
  1837 00000D68 [5D060000]              	dd      efxvolslide	; A - volume slide
  1838 00000D6C [41050000]              	dd      efxnull		; B - pattern jump
  1839 00000D70 [41050000]              	dd      efxnull		; C - set volume
  1840 00000D74 [41050000]              	dd      efxnull		; D - break pattern
  1841 00000D78 [41050000]              	dd      efxnull		; E - extra effects
  1842 00000D7C [41050000]              	dd      efxnull		; F - set speed
  1843                                  
  1844                                  ;-----------------------------------------------------------------------------
  1845                                  ; Amiga period table
  1846                                  ;-----------------------------------------------------------------------------
  1847                                  
  1848                                  ;PeriodTable0:	
  1849                                  ;	dw	0
  1850                                  PeriodTable:
  1851 00000D80 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1851 00000D89 0A000A7009E8086808-
  1851 00000D92 F00780071407       
  1852 00000D98 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1852 00000DA1 050005B80474043404-
  1852 00000DAA F803C0038A03       
  1853 00000DB0 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1853 00000DB9 0280025C023A021A02-
  1853 00000DC2 FC01E001C501       
  1854 00000DC8 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1854 00000DD1 0140012E011D010D01-
  1854 00000DDA FE00F000E200       
  1855 00000DE0 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1855 00000DE9 00A00097008F008700-
  1855 00000DF2 7F0078007100       
  1856 00000DF8 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1856 00000E01 0050004B0047004300-
  1856 00000E0A 3F003C003800       
  1857 00000E10 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1857 00000E19 002800250023002100-
  1857 00000E22 1F001E001C00       
  1858                                  
  1859                                  ;-----------------------------------------------------------------------------
  1860                                  ; Sinus wave table
  1861                                  ;-----------------------------------------------------------------------------
  1862                                  
  1863                                  SinTable:
  1864 00000E28 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1864 00000E31 C5D4E1             
  1865 00000E34 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1865 00000E3D E1                 
  1866 00000E3E D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1866 00000E47 19                 
  1867                                  
  1868 00000E48 0000                    	dw	0
  1869                                  
  1870                                  ;=============================================================================
  1871                                  ;              AC'97 data
  1872                                  ;=============================================================================
  1873                                  
  1874 00000E4A 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1875 00000E4B 08                      bps:		db 8 ; bits per sample (8 or 16)
  1876                                  Sample_Rate:
  1877 00000E4C 2256                    MixSpeed:	dw 22050 ; Hz
  1878                                  ;MixSpeed:	dw 11025 ; Hz ; 13/10/2017
  1879                                  
  1880                                  ; 13/11/2016
  1881 00000E4E 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1881 00000E57 3941424344454600   
  1882                                  msgAC97Info:	
  1883 00000E5F 0D0A                    		db 0Dh, 0Ah
  1884 00000E61 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1884 00000E6A 6F20436F6E74726F6C-
  1884 00000E73 6C6572202620436F64-
  1884 00000E7C 656320496E666F0D0A 
  1885 00000E85 56656E646F72204944-     		db "Vendor ID: "
  1885 00000E8E 3A20               
  1886 00000E90 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1886 00000E99 6963652049443A20   
  1887 00000EA1 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1888 00000EA8 4275733A20              		db "Bus: "
  1889 00000EAD 303068204465766963-     msgBusNo:	db "00h Device: "
  1889 00000EB6 653A20             
  1890 00000EB9 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1890 00000EC2 696F6E3A20         
  1891 00000EC7 303068                  msgFncNo:	db "00h"
  1892 00000ECA 0D0A                    		db 0Dh, 0Ah
  1893 00000ECC 492F4F204261736520-     		db "I/O Base Address: "
  1893 00000ED5 416464726573733A20 
  1894 00000EDE 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  1894 00000EE7 3A20               
  1895 00000EE9 3030                    msgIRQ:		dw 3030h
  1896 00000EEB 0D0A00                  		db 0Dh, 0Ah, 0
  1897                                  ;msgSampleRate:	db "Sample Rate: "
  1898                                  ;msgHertz:	db "00000 Hz ", 0
  1899                                  ;msg8Bits:	db "8 bits ", 0
  1900                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1901                                  ;msg16Bits:	db "16 bits ", 0
  1902                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1903                                  
  1904                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1905                                  ;codec_id:	   dd 0
  1906                                  ;codec_chip_id:	   dd 0
  1907                                  ;codec_vendor_ids: dw 0
  1908                                  ;codec_chip_ids:   dw 0
  1909                                  
  1910                                  ;dword_str:	dd 30303030h, 30303030h
  1911                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1912                                  
  1913                                  ;=============================================================================
  1914                                  ; Copyright Strings & Messages
  1915                                  ;=============================================================================
  1916                                  
  1917                                  msg_usage:
  1918 00000EEE 54696E79204D4F4420-     		db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1918 00000EF7 506C6179657220666F-
  1918 00000F00 72205452444F532033-
  1918 00000F09 383620627920457264-
  1918 00000F12 6F67616E2054616E2E-
  1918 00000F1B 20                 
  1919 00000F1C 4F63746F6265722032-     		db	'October 2017.',10,13
  1919 00000F25 3031372E0A0D       
  1920 00000F2B 75736167653A207469-     		db	'usage: tinyplay filename.mod', 10, 13,0
  1920 00000F34 6E79706C6179206669-
  1920 00000F3D 6C656E616D652E6D6F-
  1920 00000F46 640A0D00           
  1921 00000F4A 31352F31302F323031-     		db	'15/10/2017',0
  1921 00000F53 3700               
  1922                                  
  1923                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1924                                  
  1925 00000F55 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1925 00000F5E 506C61796572207630-
  1925 00000F67 2E3162206279204361-
  1925 00000F70 726C6F732048617361-
  1925 00000F79 6E2E204A756C792031-
  1925 00000F82 3939332E           
  1926 00000F86 0A0D00                  		db	10,13,0
  1927 00000F89 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1927 00000F92 64696E67204D6F6475-
  1927 00000F9B 6C652066696C652E0A-
  1927 00000FA4 0D00               
  1928                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1929                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1930                                  ;PortText:	db	'x0h, IRQ '
  1931                                  ;IrqText:	db	'x.',10,13,0
  1932                                  
  1933                                  trdos386_err_msg:
  1934 00000FA6 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1934 00000FAF 2053797374656D2063-
  1934 00000FB8 616C6C206572726F72-
  1934 00000FC1 20210A0D00         
  1935                                  
  1936                                  PlayMsg:
  1937 00000FC6 0D0A                    		db	0Dh, 0Ah
  1938 00000FC8 506C6179696E67206D-     		db	"Playing music... "
  1938 00000FD1 757369632E2E2E20   
  1939 00000FD9 00                      		db	0
  1940                                  OkMsg:
  1941 00000FDA 4F4B2E                  		db	"OK."
  1942                                  NextLine:
  1943 00000FDD 0D0A00                  		db	0Dh, 0Ah, 0
  1944                                  
  1945                                  ; 04/10/2017
  1946 00000FE0 0A                      pattern_shift:	db 10
  1947 00000FE1 0400                    numtracks:	dw 4
  1948                                  
  1949                                  ;=============================================================================
  1950                                  ;        	uninitialized data
  1951                                  ;=============================================================================
  1952                                  
  1953                                  bss_start:
  1954                                  
  1955                                  ABSOLUTE bss_start
  1956                                  
  1957 00000FE3 <res 00000001>          alignb 4
  1958                                  
  1959                                  ; 02/10/2017
  1960 00000FE4 <res 00000004>          bar_start:	resd	1
  1961 00000FE8 <res 00000004>          bar_stop:	resd	1
  1962                                  ; 06/10/2017
  1963 00000FEC <res 00000004>          prev_max:	resd	1
  1964                                  
  1965 00000FF0 <res 00000004>          dev_vendor:	resd 1
  1966 00000FF4 <res 00000004>          bus_dev_fn:	resd 1
  1967 00000FF8 <res 00000004>          stats_cmd:	resd 1
  1968 00000FFC <res 00000002>          ac97_io_base:	resw 1
  1969 00000FFE <res 00000001>          ac97_int_ln_reg: resb 1
  1970 00000FFF <res 00000001>          srb:		resb 1
  1971                                  
  1972                                  ; MODLOAD.ASM
  1973 00001000 <res 00000004>          FileHandle:	resd 1
  1974 00001004 <res 0000043C>          Header:		resb ModHeader.size
  1975                                  
  1976                                  ; MODPLAY.ASM
  1977                                  ;MixSpeed:	    resw 1
  1978                                  
  1979                                  ModInfo:
  1980 00001440 <res 00000001>          ModInfo.OrderLen:   resb 1
  1981 00001441 <res 00000001>          ModInfo.ReStart:    resb 1
  1982 00001442 <res 00000080>          ModInfo.Order:	    resb 128
  1983 000014C2 <res 00000004>          ModInfo.Patterns:   resd 1
  1984                                  
  1985 000014C6 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1986 00001504 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1987 00001542 <res 0000003E>          ModInfo.SampLen:    resw 31
  1988 00001580 <res 0000003E>          ModInfo.SampRep:    resw 31
  1989 000015BE <res 0000003E>          ModInfo.SampRepLen: resw 31
  1990 000015FC <res 0000003E>          ModInfo.SampVol:    resw 31
  1991                                  
  1992                                  ; MODPLAY.ASM
  1993                                  PitchTable:	;resw 857
  1994 0000163A <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  1995 000030FC <res 00004100>          VolTable:	resb 16640
  1996 000071FC <res 00001000>          MixBuffer       resb MixBufSize
  1997                                  
  1998                                  ; MODPLAY.ASM
  1999 000081FC <res 00000001>          OrderPos:	resb 1
  2000 000081FD <res 00000001>          Tempo:		resb 1
  2001 000081FE <res 00000001>          TempoWait:	resb 1
  2002 000081FF <res 00000001>          Bpm:		resb 1
  2003 00008200 <res 00000001>          Row:		resb 1
  2004 00008201 <res 00000001>          BreakRow:	resb 1
  2005 00008202 <res 00000002>          BpmSamples:	resw 1
  2006 00008204 <res 00000004>          BufPtr:		resd 1
  2007 00008208 <res 00000002>          BufLen:		resw 1
  2008 0000820A <res 00000004>          BufRep:		resd 1
  2009 0000820E <res 00000004>          Note:		resd 1
  2010                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2011                                  
  2012                                  ; 06/10/2017
  2013 00008212 <res 00000130>          Tracks:		resb TrackInfo.size*8
  2014                                  
  2015                                  mod_file_name:
  2016 00008342 <res 00000050>          		resb 80
  2017                                  
  2018                                  ; 09/10/2017
  2019 00008392 <res 00000001>          volume_level:	resb 1
  2020                                  
  2021 00008393 <res 00000C6D>          alignb 4096
  2022                                  
  2023                                  Audio_Buffer:
  2024 00009000 <res 00008000>          		resb BUFFERSIZE ; 32768 ; 09/10/2017
  2025 00011000 <res 0000F000>          alignb 65536
  2026                                  
  2027 00020000 <res 00010000>          DMA_Buffer:	resb 2*BUFFERSIZE  ; 65536 ; 09/10/2017 
  2028                                  
  2029                                  file_buffer:
  2030 00030000 <res 00060000>          		resb 65536*6 ; 06/10/2017
  2031                                  EOF:
