PLAYMOD5.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN

     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: 08/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                                  
   105                                  ; ----------------------------------------------------------------------------
   106                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   107                                  ;	July 14th, 1993.
   108                                  
   109                                  ;=============================================================================
   110                                  ;  
   111                                  ;=============================================================================
   112                                  
   113                                  [BITS 32]
   114                                  [org 0]
   115                                  
   116                                  Start:
   117                                  	; clear bss
   118 00000000 B9[00000A00]            	mov	ecx, EOF
   119 00000005 BF[770F0000]            	mov	edi, bss_start
   120 0000000A 29F9                    	sub	ecx, edi
   121 0000000C D1E9                    	shr	ecx, 1
   122 0000000E 31C0                    	xor	eax, eax
   123 00000010 F366AB                  	rep	stosw
   124                                  
   125                                  	; Detect (& Enable) VT8233 Audio Device
   126 00000013 E82B020000              	call    DetectVT8233
   127 00000018 731B                    	jnc     short GetFileName
   128                                  
   129                                  _dev_not_ready:
   130                                  ; couldn't find the audio device!
   131                                  	sys	_msg, noDevMsg, 255, 0Fh
   131                              <1> 
   131                              <1> 
   131                              <1> 
   131                              <1> 
   131                              <1>  %if %0 >= 2
   131 0000001A BB[50020000]        <1>  mov ebx, %2
   131                              <1>  %if %0 >= 3
   131 0000001F B9FF000000          <1>  mov ecx, %3
   131                              <1>  %if %0 = 4
   131 00000024 BA0F000000          <1>  mov edx, %4
   131                              <1>  %endif
   131                              <1>  %endif
   131                              <1>  %endif
   131 00000029 B823000000          <1>  mov eax, %1
   131                              <1> 
   131 0000002E CD40                <1>  int 40h
   132 00000030 E9ED010000                      jmp     Exit
   133                                  
   134                                  GetFileName:  
   135 00000035 89E6                    	mov	esi, esp
   136 00000037 AD                      	lodsd
   137 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   138                                  		; (program file name & mod file name)
   139 0000003B 0F82EA010000            	jb	pmsg_usage ; nothing to do
   140                                  
   141 00000041 AD                      	lodsd ; program file name address 
   142 00000042 AD                      	lodsd ; mod file name address (file to be read)
   143 00000043 89C6                    	mov	esi, eax
   144 00000045 BF[D6820000]            	mov	edi, mod_file_name
   145                                  ScanName:       
   146 0000004A AC                      	lodsb
   147 0000004B 84C0                    	test	al, al
   148 0000004D 0F84D8010000            	je	pmsg_usage
   149 00000053 3C20                    	cmp	al, 20h
   150 00000055 74F3                    	je	short ScanName	; scan start of name.
   151 00000057 AA                      	stosb
   152 00000058 B4FF                    	mov	ah, 0FFh
   153                                  a_0:	
   154 0000005A FEC4                    	inc	ah
   155                                  a_1:
   156 0000005C AC                      	lodsb
   157 0000005D AA                      	stosb
   158 0000005E 3C2E                    	cmp	al, '.'
   159 00000060 74F8                    	je	short a_0	
   160 00000062 20C0                    	and	al, al
   161 00000064 75F6                    	jnz	short a_1
   162                                  
   163 00000066 08E4                    	or	ah, ah		; if period NOT found,
   164 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   165                                  SetExt:
   166 0000006A 4F                      	dec	edi
   167 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   168 00000071 C6470400                	mov	byte [edi+4], 0
   169                                  PrintMesg:      
   170                                  	; Prints the Credits Text.
   171                                  	sys	_msg, Credits, 255, 0Fh
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1>  %if %0 >= 2
   171 00000075 BB[E90E0000]        <1>  mov ebx, %2
   171                              <1>  %if %0 >= 3
   171 0000007A B9FF000000          <1>  mov ecx, %3
   171                              <1>  %if %0 = 4
   171 0000007F BA0F000000          <1>  mov edx, %4
   171                              <1>  %endif
   171                              <1>  %endif
   171                              <1>  %endif
   171 00000084 B823000000          <1>  mov eax, %1
   171                              <1> 
   171 00000089 CD40                <1>  int 40h
   172                                  _1:
   173                                  	; 19/06/2017
   174                                  	; Allocate Audio Buffer (for user)
   175                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1>  %if %0 >= 2
   175 0000008B BB00020000          <1>  mov ebx, %2
   175                              <1>  %if %0 >= 3
   175 00000090 B900000100          <1>  mov ecx, %3
   175                              <1>  %if %0 = 4
   175 00000095 BA[00900000]        <1>  mov edx, %4
   175                              <1>  %endif
   175                              <1>  %endif
   175                              <1>  %endif
   175 0000009A B820000000          <1>  mov eax, %1
   175                              <1> 
   175 0000009F CD40                <1>  int 40h
   176 000000A1 0F82E6000000            	jc	error_exit
   177                                  _2:
   178                                  	; Initialize Audio Device (bl = 1 -> Interrrupt method)
   179                                  	;sys	_audio, 0301h, 0, ac97_int_handler 
   180                                  	;jc	error_exit
   181                                  	
   182                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   183                                  	sys	_audio, 0300h, 1, srb 
   183                              <1> 
   183                              <1> 
   183                              <1> 
   183                              <1> 
   183                              <1>  %if %0 >= 2
   183 000000A7 BB00030000          <1>  mov ebx, %2
   183                              <1>  %if %0 >= 3
   183 000000AC B901000000          <1>  mov ecx, %3
   183                              <1>  %if %0 = 4
   183 000000B1 BA[930F0000]        <1>  mov edx, %4
   183                              <1>  %endif
   183                              <1>  %endif
   183                              <1>  %endif
   183 000000B6 B820000000          <1>  mov eax, %1
   183                              <1> 
   183 000000BB CD40                <1>  int 40h
   184 000000BD 0F82CA000000            	jc	error_exit
   185                                  
   186                                  LoadMod:  
   187 000000C3 BF[D6820000]            	mov	edi, mod_file_name
   188 000000C8 E87F020000              	call    LoadModule		; Load the MODule...
   189                                  	; 08/10/2017
   190 000000CD 731B                    	jnc	short _3		; any error loading?
   191                                  		
   192                                  	; yes, print error and Exit.
   193                                  
   194                                  	sys	_msg, ErrorMesg, 255, 0Fh
   194                              <1> 
   194                              <1> 
   194                              <1> 
   194                              <1> 
   194                              <1>  %if %0 >= 2
   194 000000CF BB[1D0F0000]        <1>  mov ebx, %2
   194                              <1>  %if %0 >= 3
   194 000000D4 B9FF000000          <1>  mov ecx, %3
   194                              <1>  %if %0 = 4
   194 000000D9 BA0F000000          <1>  mov edx, %4
   194                              <1>  %endif
   194                              <1>  %endif
   194                              <1>  %endif
   194 000000DE B823000000          <1>  mov eax, %1
   194                              <1> 
   194 000000E3 CD40                <1>  int 40h
   195                                  
   196 000000E5 E938010000              	jmp     Exit
   197                                  
   198                                  _3:
   199                                  	; 10/06/2017
   200                                  	sys	_audio, 0E00h ; get audio controller info
   200                              <1> 
   200                              <1> 
   200                              <1> 
   200                              <1> 
   200                              <1>  %if %0 >= 2
   200 000000EA BB000E0000          <1>  mov ebx, %2
   200                              <1>  %if %0 >= 3
   200                              <1>  mov ecx, %3
   200                              <1>  %if %0 = 4
   200                              <1>  mov edx, %4
   200                              <1>  %endif
   200                              <1>  %endif
   200                              <1>  %endif
   200 000000EF B820000000          <1>  mov eax, %1
   200                              <1> 
   200 000000F4 CD40                <1>  int 40h
   201 000000F6 0F8291000000            	jc	error_exit
   202                                  
   203                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   204                                  	;jne	_dev_not_ready	
   205                                  
   206                                  	; EAX = IRQ Number in AL
   207                                  	;	Audio Device Number in AH 
   208                                  	; EBX = DEV/VENDOR ID
   209                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   210                                  	; ECX = BUS/DEV/FN 
   211                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   212                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   213                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   214                                  	;      (Low word, DX = NAMBAR address)
   215                                  
   216 000000FC A2[920F0000]            	mov	[ac97_int_ln_reg], al
   217 00000101 891D[840F0000]          	mov	[dev_vendor], ebx
   218 00000107 890D[880F0000]          	mov	[bus_dev_fn], ecx
   219 0000010D 668915[900F0000]        	mov	[ac97_io_base], dx
   220                                    
   221 00000114 E8F9090000              	call	write_audio_dev_info 
   222                                  
   223                                  PlayNow: 
   224 00000119 E814090000              	call    StartPlaying
   225                                  
   226                                         ; load 65536 bytes into audio buffer
   227 0000011E BF[00900000]            	mov     edi, Audio_Buffer
   228 00000123 BB00000100              	mov	ebx, BUFFERSIZE
   229 00000128 E886080000              	call	GetSamples
   230 0000012D 725E                    	jc	error_exit
   231                                  
   232                                  	; 23/06/2017
   233                                  	; Map DMA buffer to user's memory space
   234                                  	sys	_audio, 0D00h, 2*65536, DMA_Buffer
   234                              <1> 
   234                              <1> 
   234                              <1> 
   234                              <1> 
   234                              <1>  %if %0 >= 2
   234 0000012F BB000D0000          <1>  mov ebx, %2
   234                              <1>  %if %0 >= 3
   234 00000134 B900000200          <1>  mov ecx, %3
   234                              <1>  %if %0 = 4
   234 00000139 BA[00000200]        <1>  mov edx, %4
   234                              <1>  %endif
   234                              <1>  %endif
   234                              <1>  %endif
   234 0000013E B820000000          <1>  mov eax, %1
   234                              <1> 
   234 00000143 CD40                <1>  int 40h
   235                                  	;jc	error_exit
   236                                  
   237                                  	; Set Master Volume Level
   238                                  	sys	_audio, 0B00h, 1D1Dh
   238                              <1> 
   238                              <1> 
   238                              <1> 
   238                              <1> 
   238                              <1>  %if %0 >= 2
   238 00000145 BB000B0000          <1>  mov ebx, %2
   238                              <1>  %if %0 >= 3
   238 0000014A B91D1D0000          <1>  mov ecx, %3
   238                              <1>  %if %0 = 4
   238                              <1>  mov edx, %4
   238                              <1>  %endif
   238                              <1>  %endif
   238                              <1>  %endif
   238 0000014F B820000000          <1>  mov eax, %1
   238                              <1> 
   238 00000154 CD40                <1>  int 40h
   239                                  
   240                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   241                                  
   242                                  	; 07/10/2017
   243                                  	;mov	word [MixSpeed], 22222	; Mixing at 22 kHz
   244                                  	
   245                                  	; Start	to play
   246 00000156 A0[DF0D0000]            	mov	al, [bps]
   247 0000015B C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   248 0000015E D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   249 00000160 8A1D[DE0D0000]          	mov	bl, [stmo]
   250 00000166 FECB                    	dec	bl
   251 00000168 08C3                    	or	bl, al
   252 0000016A 668B0D[E00D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   253 00000171 B704                    	mov	bh, 4 ; start to play	
   254                                  	sys	_audio
   254                              <1> 
   254                              <1> 
   254                              <1> 
   254                              <1> 
   254                              <1>  %if %0 >= 2
   254                              <1>  mov ebx, %2
   254                              <1>  %if %0 >= 3
   254                              <1>  mov ecx, %3
   254                              <1>  %if %0 = 4
   254                              <1>  mov edx, %4
   254                              <1>  %endif
   254                              <1>  %endif
   254                              <1>  %endif
   254 00000173 B820000000          <1>  mov eax, %1
   254                              <1> 
   254 00000178 CD40                <1>  int 40h
   255                                      
   256                                  	;; SETUP SIGNAL RESPONSE BYTE
   257                                  	;; 06/03/2017
   258                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   259                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   260                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   261                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   262                                  	;sys	_calbac
   263                                  	;jc	short error_exit
   264                                  
   265                                  	; 06/10/2017
   266                                  
   267                                  	; DIRECT CGA MEMORY ACCESS
   268                                  	; bl = 0, bh = 4
   269                                  	; Direct access/map to CGA memory (0B8000h)
   270                                  
   271                                  	sys	_video, 0400h
   271                              <1> 
   271                              <1> 
   271                              <1> 
   271                              <1> 
   271                              <1>  %if %0 >= 2
   271 0000017A BB00040000          <1>  mov ebx, %2
   271                              <1>  %if %0 >= 3
   271                              <1>  mov ecx, %3
   271                              <1>  %if %0 = 4
   271                              <1>  mov edx, %4
   271                              <1>  %endif
   271                              <1>  %endif
   271                              <1>  %endif
   271 0000017F B81F000000          <1>  mov eax, %1
   271                              <1> 
   271 00000184 CD40                <1>  int 40h
   272 00000186 3D00800B00              	cmp	eax, 0B8000h
   273 0000018B 7418                    	je	short _a3
   274                                  error_exit:
   275                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   275                              <1> 
   275                              <1> 
   275                              <1> 
   275                              <1> 
   275                              <1>  %if %0 >= 2
   275 0000018D BB[3A0F0000]        <1>  mov ebx, %2
   275                              <1>  %if %0 >= 3
   275 00000192 B9FF000000          <1>  mov ecx, %3
   275                              <1>  %if %0 = 4
   275 00000197 BA0E000000          <1>  mov edx, %4
   275                              <1>  %endif
   275                              <1>  %endif
   275                              <1>  %endif
   275 0000019C B823000000          <1>  mov eax, %1
   275                              <1> 
   275 000001A1 CD40                <1>  int 40h
   276 000001A3 EB7D                    	jmp	short Exit
   277                                  
   278                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   279                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   280                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   281                                  ;       second, or the module will sound "looped".
   282                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   283                                  ;       the polling is called from my routine, and then the irq 0 must be
   284                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   285                                  ;       samples played by the Sound Blaster. Note that some samples are
   286                                  ;       discarded in the next code, just for fun!
   287                                  
   288                                  _a3:
   289                                  	; 02/10/2017
   290                                  	; Print "Playing..." message.
   291                                  	sys	_msg, PlayMsg, 255, 0Fh
   291                              <1> 
   291                              <1> 
   291                              <1> 
   291                              <1> 
   291                              <1>  %if %0 >= 2
   291 000001A5 BB[5A0F0000]        <1>  mov ebx, %2
   291                              <1>  %if %0 >= 3
   291 000001AA B9FF000000          <1>  mov ecx, %3
   291                              <1>  %if %0 = 4
   291 000001AF BA0F000000          <1>  mov edx, %4
   291                              <1>  %endif
   291                              <1>  %endif
   291                              <1>  %endif
   291 000001B4 B823000000          <1>  mov eax, %1
   291                              <1> 
   291 000001B9 CD40                <1>  int 40h
   292                                  	; Get current cursor position
   293 000001BB B403                    	mov	ah, 3
   294 000001BD B700                    	mov	bh, 0 ; Video Page 0
   295 000001BF CD31                    	int	31h
   296                                  	; dh = row, dl = column
   297                                  	; 06/10/2017 (scroll check on next line)
   298 000001C1 80FE18                  	cmp	dh, 24 ; the last row
   299 000001C4 7202                    	jb	short set_bar_pos
   300 000001C6 FECE                    	dec	dh
   301                                  set_bar_pos:
   302 000001C8 B050                    	mov	al, 80
   303 000001CA F6E6                    	mul	dh
   304 000001CC 30F6                    	xor	dh, dh
   305 000001CE 6601D0                  	add	ax, dx
   306 000001D1 66D1E0                  	shl	ax, 1
   307 000001D4 BB00800B00              	mov	ebx, 0B8000h
   308 000001D9 6601C3                  	add	bx, ax
   309 000001DC 891D[780F0000]          	mov	[bar_start], ebx
   310 000001E2 6683C320                	add	bx, 2*16
   311 000001E6 891D[7C0F0000]          	mov	[bar_stop], ebx
   312                                  
   313                                  	; Print (GoTo) NextLine.
   314                                  	sys	_msg, NextLine, 3, 07h
   314                              <1> 
   314                              <1> 
   314                              <1> 
   314                              <1> 
   314                              <1>  %if %0 >= 2
   314 000001EC BB[710F0000]        <1>  mov ebx, %2
   314                              <1>  %if %0 >= 3
   314 000001F1 B903000000          <1>  mov ecx, %3
   314                              <1>  %if %0 = 4
   314 000001F6 BA07000000          <1>  mov edx, %4
   314                              <1>  %endif
   314                              <1>  %endif
   314                              <1>  %endif
   314 000001FB B823000000          <1>  mov eax, %1
   314                              <1> 
   314 00000200 CD40                <1>  int 40h
   315                                  	;
   316                                  
   317 00000202 E880000000              	call	ModPlay ; 13/02/2017
   318                                  
   319                                  _s_exit:
   320 00000207 E8D5080000              	call	StopPlaying	; STOP!
   321                                  
   322                                  	; 02/10/2017
   323                                  	; Print "OK." message.
   324                                  	sys	_msg, OkMsg, 255, 0Fh
   324                              <1> 
   324                              <1> 
   324                              <1> 
   324                              <1> 
   324                              <1>  %if %0 >= 2
   324 0000020C BB[6E0F0000]        <1>  mov ebx, %2
   324                              <1>  %if %0 >= 3
   324 00000211 B9FF000000          <1>  mov ecx, %3
   324                              <1>  %if %0 = 4
   324 00000216 BA0F000000          <1>  mov edx, %4
   324                              <1>  %endif
   324                              <1>  %endif
   324                              <1>  %endif
   324 0000021B B823000000          <1>  mov eax, %1
   324                              <1> 
   324 00000220 CD40                <1>  int 40h
   325                                  Exit:           
   326                                  	;call    FreeModule	; Free MODule core.
   327                                  	
   328                                  	sys 	_exit	; Bye !
   328                              <1> 
   328                              <1> 
   328                              <1> 
   328                              <1> 
   328                              <1>  %if %0 >= 2
   328                              <1>  mov ebx, %2
   328                              <1>  %if %0 >= 3
   328                              <1>  mov ecx, %3
   328                              <1>  %if %0 = 4
   328                              <1>  mov edx, %4
   328                              <1>  %endif
   328                              <1>  %endif
   328                              <1>  %endif
   328 00000222 B801000000          <1>  mov eax, %1
   328                              <1> 
   328 00000227 CD40                <1>  int 40h
   329                                  here:
   330 00000229 EBFE                    	jmp	short here
   331                                  
   332                                  pmsg_usage:
   333                                  	sys	_msg, msg_usage, 255, 0Fh
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1>  %if %0 >= 2
   333 0000022B BB[820E0000]        <1>  mov ebx, %2
   333                              <1>  %if %0 >= 3
   333 00000230 B9FF000000          <1>  mov ecx, %3
   333                              <1>  %if %0 = 4
   333 00000235 BA0F000000          <1>  mov edx, %4
   333                              <1>  %endif
   333                              <1>  %endif
   333                              <1>  %endif
   333 0000023A B823000000          <1>  mov eax, %1
   333                              <1> 
   333 0000023F CD40                <1>  int 40h
   334 00000241 EBDF                    	jmp	short Exit
   335                                  
   336                                  DetectVT8233:
   337                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   338                                          sys	_audio, 0103h
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1>  %if %0 >= 2
   338 00000243 BB03010000          <1>  mov ebx, %2
   338                              <1>  %if %0 >= 3
   338                              <1>  mov ecx, %3
   338                              <1>  %if %0 = 4
   338                              <1>  mov edx, %4
   338                              <1>  %endif
   338                              <1>  %endif
   338                              <1>  %endif
   338 00000248 B820000000          <1>  mov eax, %1
   338                              <1> 
   338 0000024D CD40                <1>  int 40h
   339 0000024F C3                      	retn
   340                                  
   341                                  noDevMsg:
   342 00000250 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   342 00000259 61626C6520746F2066-
   342 00000262 696E64205649412056-
   342 0000026B 543832333320626173-
   342 00000274 656420617564696F20-
   342 0000027D 646576696365210D0A-
   342 00000286 00                 
   343                                  
   344                                  ;ac97_int_handler:
   345                                  ;	; 19/06/2017
   346                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   347                                  ;
   348                                  ;	sys	_rele ; return from callback service 
   349                                  ;	; we must not come here !
   350                                  ;	sys	_exit
   351                                  
   352                                  ;=============================================================================
   353                                  ;      
   354                                  ;=============================================================================
   355                                  
   356                                  ModPlay:
   357                                  	; 06/10/2017
   358                                  	; 23/06/2017   
   359                                  	; 21/06/2017
   360                                  	; 19/06/2017
   361                                  
   362                                  	; 05/03/2017 (TRDOS 386)
   363                                  	; 14/02/2017
   364                                  	; 13/02/2017
   365                                  	; 08/12/2016
   366                                  	; 28/11/2016
   367                                  
   368 00000287 EB10                         	jmp	short modp_gs ; 23/06/2017
   369                                  p_loop:
   370 00000289 803D[930F0000]00        	cmp	byte [srb], 0
   371 00000290 7616                    	jna	short q_loop
   372 00000292 C605[930F0000]00        	mov	byte [srb], 0
   373                                  modp_gs:
   374 00000299 BF[00900000]            	mov     edi, Audio_Buffer
   375 0000029E BB00000100              	mov	ebx, BUFFERSIZE ; 65536 bytes ; 25/06/2017
   376 000002A3 E80B070000              	call    GetSamples
   377                                  q_loop:
   378 000002A8 B401                    	mov     ah, 1		; any key pressed?
   379 000002AA CD32                    	int     32h		; no, Loop.
   380 000002AC 7405                    	jz	short r_loop
   381                                  
   382 000002AE B400                    	mov     ah, 0		; flush key buffer...
   383 000002B0 CD32                    	int     32h
   384                                  q_return:
   385 000002B2 C3                      	retn
   386                                  r_loop:
   387                                  	; 08/10/2017
   388 000002B3 FE05[4B030000]          	inc	byte [counter]
   389 000002B9 8025[4B030000]0F        	and	byte [counter], 0Fh
   390 000002C0 7400                    	jz	short BarLoop	
   391                                  BarLoop:
   392                                  	; Get Current DMA buffer Pointer 
   393                                  	; 23/06/2017
   394                                  	; bh = 15, get current pointer (DMA buffer offset)
   395                                  	; bl = 0, for PCM OUT
   396                                  	; ecx = 0
   397                                  	;
   398                                  	sys	_audio, 0F00h, 0
   398                              <1> 
   398                              <1> 
   398                              <1> 
   398                              <1> 
   398                              <1>  %if %0 >= 2
   398 000002C2 BB000F0000          <1>  mov ebx, %2
   398                              <1>  %if %0 >= 3
   398 000002C7 B900000000          <1>  mov ecx, %3
   398                              <1>  %if %0 = 4
   398                              <1>  mov edx, %4
   398                              <1>  %endif
   398                              <1>  %endif
   398                              <1>  %endif
   398 000002CC B820000000          <1>  mov eax, %1
   398                              <1> 
   398 000002D1 CD40                <1>  int 40h
   399                                  
   400                                  	; 06/10/2017
   401 000002D3 BE[00000200]            	mov	esi, DMA_Buffer
   402 000002D8 01C6                    	add     esi, eax	; add offset value
   403                                      
   404                                  	; 02/10/2017 
   405 000002DA 8B0D[7C0F0000]          	mov     ecx, [bar_stop]	; get previous bar stop address
   406 000002E0 8B3D[780F0000]          	mov	edi, [bar_start]
   407                                  	; 06/10/2017
   408 000002E6 66B80007                	mov	ax, 0700h ; Blank
   409 000002EA 668907                  	mov	[edi], ax
   410 000002ED 29F9                    	sub	ecx, edi
   411 000002EF 761E                    	jna	short check_volume
   412 000002F1 89FA                    	mov	edx, edi
   413 000002F3 D0E9                    	shr	cl, 1
   414 000002F5 F366AB                  	rep	stosw
   415 000002F8 89D7                    	mov	edi, edx
   416 000002FA 8B15[800F0000]          	mov	edx, [prev_max]
   417 00000300 09D2                    	or	edx, edx
   418 00000302 740B                    	jz	short check_volume
   419 00000304 39FA                    	cmp	edx, edi
   420 00000306 7607                    	jna	short check_volume
   421 00000308 B0DB                    	mov	al, 0DBh ; 219 ; Block
   422 0000030A B40C                    	mov	ah, 0Ch ; Light Red
   423 0000030C 668902                  	mov	[edx], ax
   424                                  check_volume:
   425                                  	; 06/10/2017
   426 0000030F 8A06                    	mov	al, [esi]
   427 00000311 C0E804                  	shr	al, 4 ; al = 0 to 15
   428 00000314 742A                    	jz	short update_bar_stop
   429 00000316 88C1                    	mov	cl, al
   430                                  draw_bar:
   431 00000318 B0DB                    	mov	al, 0DBh ; 219 ; Block
   432 0000031A B40A                    	mov	ah, 0Ah ; Light Green
   433 0000031C F366AB                  	rep	stosw
   434 0000031F 89FA                    	mov	edx, edi
   435 00000321 4A                      	dec	edx
   436 00000322 4A                      	dec	edx	
   437 00000323 3B15[800F0000]          	cmp	edx, [prev_max]
   438 00000329 7508                    	jne	short new_max_volume
   439 0000032B 890D[800F0000]          	mov	[prev_max], ecx ; 0 ; *
   440                                  	;jmp	short blank_prev_max
   441 00000331 EB0D                    	jmp	short update_bar_stop
   442                                  new_max_volume:	 
   443 00000333 B40C                    	mov	ah, 0Ch ; Light Red
   444 00000335 668902                  	mov	[edx], ax
   445 00000338 8715[800F0000]          	xchg	[prev_max], edx
   446                                  	;cmp	edx, [prev_max] ; ** not necessary ?!
   447                                  	;ja	short update_bar_stop ; **  not necessary ?!
   448                                  blank_prev_max:
   449 0000033E 890A                    	mov	[edx], ecx ; 0 ; *
   450                                  update_bar_stop:
   451 00000340 893D[7C0F0000]          	mov	[bar_stop], edi
   452                                  	;
   453 00000346 E93EFFFFFF              	jmp	p_loop
   454                                  
   455                                  counter: ; 08/10/2017
   456 0000034B 0F                      	db 	15
   457                                  
   458                                  ;=============================================================================
   459                                  ;               MODLOAD.ASM
   460                                  ;=============================================================================
   461                                  
   462                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   463                                  ;	July 10th, 1993.
   464                                  
   465                                  ; STRUCTURES
   466                                  
   467                                  struc ModSample
   468 00000000 <res 00000016>          .msName:	resb 22
   469 00000016 <res 00000002>          .msLength:	resw 1
   470 00000018 <res 00000001>          .msFinetune:	resb 1
   471 00000019 <res 00000001>          .msVolume:	resb 1
   472 0000001A <res 00000002>          .msRepeat:	resw 1
   473 0000001C <res 00000002>          .msRepLen:	resw 1
   474                                  .size:		; 30 bytes
   475                                  endstruc
   476                                  
   477                                  struc ModHeader
   478 00000000 <res 00000014>          .mhName:	resb 20
   479 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   480 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   481 000003B7 <res 00000001>          .mhReStart:	resb 1
   482 000003B8 <res 00000080>          .mhOrder:	resb 128
   483 00000438 <res 00000004>          .mhSign:	resw 2
   484                                  .size:		; 1084 bytes
   485                                  endstruc
   486                                  
   487                                  struc ModInfoRec
   488 00000000 <res 00000001>          .OrderLen:	resb 1
   489 00000001 <res 00000001>          .ReStart:	resb 1
   490 00000002 <res 00000080>          .Order:		resb 128
   491 00000082 <res 00000004>          .Patterns:	resd 1
   492 00000086 <res 0000003E>          .SampOfs:	resw 31
   493 000000C4 <res 0000003E>          .SampSeg:	resw 31
   494 00000102 <res 0000003E>          .SampLen:	resw 31
   495 00000140 <res 0000003E>          .SampRep:	resw 31
   496 0000017E <res 0000003E>          .SampRepLen:	resw 31
   497 000001BC <res 0000003E>          .SampVol:	resw 31
   498                                  .size:		; 506 bytes	
   499                                  endstruc
   500                                  
   501                                  ; CODE
   502                                  
   503                                  ; 06/10/2017
   504                                  ; 04/10/2017
   505                                  ; /* MOD FileFormat */
   506                                  
   507                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   508                                  ID_FLT4 equ 34544C46h ; "FLT4"
   509                                  ID_8CHN equ 4E484338h ; "8CHN"
   510                                  ID_FLT8 equ 34544C46h ; "FLT8"
   511                                  
   512                                  ; CODE
   513                                  
   514                                  LoadModule:
   515                                  	; edi = file name address
   516                                  
   517 0000034C 60                      	pushad
   518                                  
   519                                  	;call	ClearModInfo
   520                                  OpenFile:       
   521                                  	; ebx = ASCIIZ file name address
   522                                  	; ecx = open mode (0 = open for read)		
   523                                  	sys	_open, edi, 0 ; open for reading
   523                              <1> 
   523                              <1> 
   523                              <1> 
   523                              <1> 
   523                              <1>  %if %0 >= 2
   523 0000034D 89FB                <1>  mov ebx, %2
   523                              <1>  %if %0 >= 3
   523 0000034F B900000000          <1>  mov ecx, %3
   523                              <1>  %if %0 = 4
   523                              <1>  mov edx, %4
   523                              <1>  %endif
   523                              <1>  %endif
   523                              <1>  %endif
   523 00000354 B805000000          <1>  mov eax, %1
   523                              <1> 
   523 00000359 CD40                <1>  int 40h
   524 0000035B 0F8262010000            	jc	Failed
   525 00000361 A3[940F0000]            	mov     [FileHandle], eax
   526                                  ReadHeader:
   527                                  	; ebx = File handle
   528                                  	; ecx = Buffer address
   529                                  	; edx = Byte count
   530                                  	sys	_read, [FileHandle], Header, ModHeader.size
   530                              <1> 
   530                              <1> 
   530                              <1> 
   530                              <1> 
   530                              <1>  %if %0 >= 2
   530 00000366 8B1D[940F0000]      <1>  mov ebx, %2
   530                              <1>  %if %0 >= 3
   530 0000036C B9[980F0000]        <1>  mov ecx, %3
   530                              <1>  %if %0 = 4
   530 00000371 BA3C040000          <1>  mov edx, %4
   530                              <1>  %endif
   530                              <1>  %endif
   530                              <1>  %endif
   530 00000376 B803000000          <1>  mov eax, %1
   530                              <1> 
   530 0000037B CD40                <1>  int 40h
   531 0000037D 0F8231010000            	jc      CloseFile
   532                                  CheckMK:  
   533                                  	; 04/10/2017
   534 00000383 A1[D0130000]            	mov	eax, [Header+ModHeader.mhSign]
   535                                        
   536 00000388 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   537                                  	;je	short Is4chnMod
   538 0000038D 742B                    	je	short IsModFile
   539                                  CheckFLT4:
   540 0000038F 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   541                                  	;je	short Is4chnMod
   542 00000394 7424                    	je	short IsModFile
   543                                  Check8CHN:
   544 00000396 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   545 0000039B 740D                    	je	short Is8chnMod
   546                                  CheckFLT8:
   547 0000039D 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   548                                  	; 06/10/2017
   549 000003A2 7406                    	je	short Is8chnMod
   550 000003A4 F9                      	stc
   551 000003A5 E90A010000              	jmp	CloseFile
   552                                  Is8chnMod:
   553 000003AA C605[750F0000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   554 000003B1 C605[740F0000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   555 000003B8 EB00                    	jmp	short IsModFile
   556                                  ;Is4chnMod:
   557                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   558                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   559                                  
   560                                  IsModFile:
   561 000003BA A0[4E130000]            	mov     al, [Header+ModHeader.mhOrderLen]
   562 000003BF A2[D4130000]            	mov     [ModInfo.OrderLen], al
   563                                  
   564 000003C4 A0[4F130000]            	mov     al, [Header+ModHeader.mhReStart]
   565 000003C9 3A05[4E130000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   566 000003CF 7202                    	jb      short SetReStart
   567 000003D1 B07F                    	mov     al, 7Fh
   568                                  SetReStart:
   569 000003D3 A2[D5130000]            	mov     [ModInfo.ReStart], al
   570                                  
   571                                  	;mov	ecx, 128
   572 000003D8 66B98000                	mov	cx, 128
   573 000003DC 31D2                    	xor     edx, edx
   574 000003DE 31DB                    	xor     ebx, ebx
   575                                  CopyOrder:
   576 000003E0 8AB3[50130000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   577 000003E6 88B3[D6130000]          	mov     [ModInfo.Order+ebx], dh
   578 000003EC 38D6                    	cmp     dh, dl
   579 000003EE 7202                    	jb      short NextOrder
   580 000003F0 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   581                                  NextOrder:
   582 000003F2 43                      	inc     ebx
   583 000003F3 E2EB                    	loop    CopyOrder
   584                                  AllocPatterns:  
   585 000003F5 81E2FF000000            	and	edx, 0FFh
   586                                  	; 04/10/2017
   587                                  	;inx	dx  ; 12/03/2017
   588 000003FB FEC2                    	inc	dl
   589                                  	; dl = number of patterns (04/07/2017)
   590 000003FD 8A0D[740F0000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   591 00000403 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   592                                  				     ; *2048 ; (byte count of patterns *64*8*4)
   593                                  	;
   594 00000405 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   595                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   596 00000407 B9[00000400]            	mov	ecx, file_buffer ; 12/03/2017
   597                                  	;
   598 0000040C 890D[56140000]          	mov	[ModInfo.Patterns], ecx
   599                                  	;
   600 00000412 01CD                    	add	ebp, ecx ; next offset for samples
   601                                  ReadPatterns:  
   602                                  	;mov	ebx, [FileHandle] 
   603                                  	; ebx = File handle
   604                                  	; ecx = Buffer address
   605                                  	; edx = Byte count
   606                                  	sys	_read, [FileHandle]
   606                              <1> 
   606                              <1> 
   606                              <1> 
   606                              <1> 
   606                              <1>  %if %0 >= 2
   606 00000414 8B1D[940F0000]      <1>  mov ebx, %2
   606                              <1>  %if %0 >= 3
   606                              <1>  mov ecx, %3
   606                              <1>  %if %0 = 4
   606                              <1>  mov edx, %4
   606                              <1>  %endif
   606                              <1>  %endif
   606                              <1>  %endif
   606 0000041A B803000000          <1>  mov eax, %1
   606                              <1> 
   606 0000041F CD40                <1>  int 40h
   607 00000421 0F828D000000            	jc      CloseFile
   608                                  
   609                                  	; patterns have been loaded here... (04/07/2017)
   610                                  
   611 00000427 BE[AC0F0000]            	mov	esi, Header+ModHeader.mhSamples
   612 0000042C 31FF                    	xor     edi, edi
   613                                  CopySamples:
   614 0000042E 668B4616                	mov     ax, [esi+ModSample.msLength]
   615 00000432 86C4                    	xchg    al, ah
   616 00000434 66D1E0                  	shl     ax, 1
   617 00000437 668987[D6140000]        	mov     [ModInfo.SampLen+edi], ax
   618 0000043E 8A4619                  	mov     al, [esi+ModSample.msVolume]
   619 00000441 30E4                    	xor     ah, ah
   620 00000443 668987[90150000]        	mov     [ModInfo.SampVol+edi], ax
   621 0000044A 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   622 0000044E 86C4                    	xchg    al, ah
   623 00000450 66D1E0                  	shl     ax, 1
   624 00000453 668987[14150000]        	mov     [ModInfo.SampRep+edi], ax
   625 0000045A 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   626 0000045E 86C4                    	xchg    al, ah
   627 00000460 66D1E0                  	shl     ax, 1
   628 00000463 668987[52150000]        	mov     [ModInfo.SampRepLen+edi], ax
   629 0000046A 83C61E                  	add     esi, ModSample.size
   630 0000046D 6683C702                	add     di, 2
   631 00000471 6683FF3E                	cmp     di, 2*31
   632 00000475 72B7                    	jb      short CopySamples
   633                                  
   634 00000477 31F6                    	xor     esi, esi
   635                                  AllocSamples:
   636 00000479 0FB796[D6140000]        	movzx	edx, word [ModInfo.SampLen+esi]
   637                                  	; 07/10/2017
   638                                  	;shr	dx, 4 ; ***
   639 00000480 21D2                    	and	edx, edx
   640 00000482 7426                    	jz      short NextSample
   641                                  	;inc	dx  ; number of paragraphs ; ***
   642                                  	;shl	dx, 4 ; ***
   643 00000484 89E8                    	mov	eax, ebp
   644 00000486 668986[5A140000]        	mov	[ModInfo.SampOfs+esi], ax
   645 0000048D C1E810                  	shr	eax, 16
   646 00000490 668986[98140000]        	mov	[ModInfo.SampSeg+esi], ax
   647 00000497 89E9                    	mov	ecx, ebp
   648 00000499 01D5                    	add	ebp, edx ; next offset for sample 
   649                                  ReadSample:
   650                                  	;mov	ebx, [FileHandle]
   651                                  	;movzx  edx, [ModInfo.SampLen+esi]
   652                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   653                                  
   654                                  	; ebx = File handle
   655                                  	; ecx = Buffer address
   656                                  	; edx = Byte count
   657                                  	sys	_read, [FileHandle]
   657                              <1> 
   657                              <1> 
   657                              <1> 
   657                              <1> 
   657                              <1>  %if %0 >= 2
   657 0000049B 8B1D[940F0000]      <1>  mov ebx, %2
   657                              <1>  %if %0 >= 3
   657                              <1>  mov ecx, %3
   657                              <1>  %if %0 = 4
   657                              <1>  mov edx, %4
   657                              <1>  %endif
   657                              <1>  %endif
   657                              <1>  %endif
   657 000004A1 B803000000          <1>  mov eax, %1
   657                              <1> 
   657 000004A6 CD40                <1>  int 40h
   658 000004A8 720A                    	jc      short CloseFile
   659                                  
   660                                  NextSample:
   661 000004AA 6683C602                	add     si, 2
   662 000004AE 6683FE3E                	cmp     si, 2*31
   663 000004B2 72C5                    	jb      short AllocSamples
   664                                  CloseFile:      
   665 000004B4 9C                      	pushf
   666                                  	sys	_close, [FileHandle]
   666                              <1> 
   666                              <1> 
   666                              <1> 
   666                              <1> 
   666                              <1>  %if %0 >= 2
   666 000004B5 8B1D[940F0000]      <1>  mov ebx, %2
   666                              <1>  %if %0 >= 3
   666                              <1>  mov ecx, %3
   666                              <1>  %if %0 = 4
   666                              <1>  mov edx, %4
   666                              <1>  %endif
   666                              <1>  %endif
   666                              <1>  %endif
   666 000004BB B806000000          <1>  mov eax, %1
   666                              <1> 
   666 000004C0 CD40                <1>  int 40h
   667 000004C2 9D                      	popf
   668                                  Failed:       
   669 000004C3 61                      	popad
   670 000004C4 C3                      	retn
   671                                  
   672                                  ;=============================================================================
   673                                  ;               MODPLAY.ASM
   674                                  ;=============================================================================
   675                                  
   676                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   677                                  ;	July 23th, 1993.
   678                                  
   679                                  ; EQUATES
   680                                  
   681                                  ;NumTracks	equ 4 ; 06/10/2017 ([numtracks])
   682                                  DefTempo        equ 6
   683                                  DefBpm          equ 125
   684                                  MidCRate        equ 8448
   685                                  MixBufSize      equ 4096
   686                                  
   687                                  ; STRUCTURES
   688                                  
   689                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   690 00000000 <res 00000004>          .Samples:	resd 1
   691                                  ;.Position:	resw 1
   692 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   693 00000008 <res 00000002>          .Len:		resw 1
   694 0000000A <res 00000002>          .Repeat:	resw 1
   695 0000000C <res 00000002>          .RepLen:	resw 1
   696 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   697 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   698                                  ;.Error:	resb 1
   699                                  ;.Reserved:	resb 1 ; 01/10/2017
   700 00000010 <res 00000002>          .Period:	resw 1 ; Period
   701 00000012 <res 00000002>          .Pitch:		resw 1 
   702 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   703 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   704 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   705 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   706 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   707 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   708 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   709                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   710 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
   711 0000001E <res 00000006>          .Arp:		resw 3
   712 00000024 <res 00000002>          .ArpIndex:	resw 1
   713                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   714                                  endstruc
   715                                  
   716                                  ; CODE
   717                                  
   718                                  ;--------------------------------------------------------------------------
   719                                  ; updatechannel - update the track using the current effect
   720                                  ;--------------------------------------------------------------------------
   721                                  ; 
   722                                  ;--------------------------------------------------------------------------
   723                                  ; BeatTrack:  Process the next beat in one track.
   724                                  ;  In:
   725                                  ;    ds:di -  Track info Address.
   726                                  ;--------------------------------------------------------------------------
   727                                  
   728                                  ; edi = Track info address
   729                                  
   730                                  updatechannel:
   731                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   732                                  
   733 000004C5 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   734                                  
   735                                  	;test   dx, dx
   736                                  	;je     short None
   737                                  	;cmp    dh, 00h
   738                                  	;je     short Arpeggio
   739                                  	;cmp    dh, 01h
   740                                  	;je     short PortUp
   741                                  	;cmp    dh, 02h
   742                                  	;je     short PortDown
   743                                  	;cmp    dh, 03h
   744                                  	;je     TonePort
   745                                  	;cmp    dh, 04h
   746                                  	;je     Vibrato
   747                                  	;cmp    dh, 05h
   748                                  	;je     PortSlide
   749                                  	;cmp    dh, 06h
   750                                  	;je     VibSlide
   751                                  	;cmp    dh, 0Ah
   752                                  	;je     VolSlide
   753                                  	;retn
   754                                  
   755 000004C9 0FB6C6                  	movzx	eax, dh
   756 000004CC 240F                    	and	al, 0Fh
   757 000004CE FF2485[D40C0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   758                                  efxnull:
   759                                  None:           
   760 000004D5 C3                      	retn
   761                                  efxarpeggio2:
   762                                  	; 01/10/2017
   763 000004D6 84D2                    	test    dl, dl
   764 000004D8 74FB                    	jz      short efxnull
   765                                  Arpeggio:
   766 000004DA 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   767 000004DE 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   768 000004E3 66894712                	mov     [edi+TrackInfo.Pitch], ax
   769 000004E7 6683C302                	add     bx, 2
   770 000004EB 6683FB06                	cmp     bx, 6
   771 000004EF 7202                    	jb      short SetArpIndex
   772 000004F1 31DB                    	xor     ebx, ebx
   773                                  SetArpIndex:
   774 000004F3 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   775 000004F7 C3                      	retn
   776                                  efxportaup:
   777                                  PortUp:
   778 000004F8 30F6                    	xor     dh, dh
   779                                  	;mov	bx, [edi+TrackInfo.Period]
   780 000004FA 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   781 000004FE 6629D3                  	sub     bx, dx
   782                                  	;cmp	bx, 113
   783 00000501 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   784 00000505 7D04                    	jge     short NotSmall
   785                                  	;mov	bx, 113
   786 00000507 66BB1C00                	mov	bx, 28 ; 01/10/2017
   787                                  NotSmall:
   788 0000050B 66895F10                	mov     [edi+TrackInfo.Period], bx
   789 0000050F 6601DB                  	add     bx, bx
   790                                  	;mov	ax, [PitchTable+bx]
   791 00000512 668B83[CE150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   792 00000519 66894712                	mov     [edi+TrackInfo.Pitch], ax
   793 0000051D C3                      	retn
   794                                  efxportadown:
   795                                  PortDown:
   796 0000051E 30F6                    	xor     dh, dh
   797                                  	;mov	bx, [edi+TrackInfo.Period]
   798 00000520 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   799 00000524 6601D3                  	add     bx, dx
   800 00000527 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   801                                  	;cmp	bx, 856
   802 0000052C 7E04                    	jle     short NotBig
   803                                  	;mov	bx, 856
   804 0000052E 66BB600D                	mov	bx, 3424 ; 01/10/2017
   805                                  NotBig:         
   806 00000532 66895F10                	mov     [edi+TrackInfo.Period], bx
   807 00000536 6601DB                  	add     bx, bx
   808                                  	;mov	ax, [PitchTable+bx]
   809 00000539 668B83[CE150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   810 00000540 66894712                	mov     [edi+TrackInfo.Pitch], ax
   811 00000544 C3                      	retn
   812                                  efxtoneporta2:
   813                                  TonePort:
   814 00000545 30F6                    	xor     dh, dh
   815 00000547 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   816                                  	;mov	bx, [edi+TrackInfo.Period]
   817 0000054B 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   818 0000054F 6639C3                  	cmp     bx, ax
   819 00000552 7429                    	je      short NoPort
   820 00000554 7F0D                    	jg      short PortToUp
   821                                  PortToDown:     
   822 00000556 6601D3                  	add     bx, dx
   823 00000559 6639C3                  	cmp     bx, ax
   824 0000055C 7E0D                    	jle     short SetPort
   825                                  FixPort:        
   826 0000055E 6689C3                  	mov     bx, ax
   827 00000561 EB08                    	jmp     short SetPort
   828                                  PortToUp:
   829 00000563 6629D3                  	sub     bx, dx
   830 00000566 6639C3                  	cmp     bx, ax
   831 00000569 7CF3                    	jl      short FixPort
   832                                  SetPort:        
   833 0000056B 66895F10                	mov     [edi+TrackInfo.Period], bx
   834 0000056F 6601DB                  	add     bx, bx
   835                                  	;mov	ax, [PitchTable+bx]
   836 00000572 668B83[CE150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   837 00000579 66894712                	mov     [edi+TrackInfo.Pitch], ax
   838                                  NoPort:         
   839 0000057D C3                      	retn
   840                                  efxvibrato2:
   841                                  	; 01/10/2017
   842                                  Vibrato:
   843 0000057E 88D6                    	mov     dh, dl
   844                                  	;and	dl, 0Fh
   845                                  	;shr	dh, 4
   846                                  	;shl	dh, 2
   847 00000580 6681E20FF0              	and     dx, 0F00Fh
   848 00000585 C0EE02                  	shr     dh, 2
   849                                  	;add	[edi+TrackInfo.VibPos], dh
   850                                  	;mov	dh, [edi+TrackInfo.VibPos]
   851                                  	;mov	bl, dh
   852 00000588 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   853 0000058B 007719                  	add	[edi+TrackInfo.VibPos], dh
   854 0000058E 88DE                    	mov	dh, bl ; 01/10/2017
   855 00000590 C0EB02                  	shr     bl, 2
   856                                  	;and	bx, 1Fh
   857                                  	;mov	al, [SinTable+bx]
   858 00000593 83E31F                  	and	ebx, 1Fh
   859 00000596 8A83[BC0D0000]          	mov	al, [SinTable+ebx]
   860 0000059C F6E2                    	mul     dl
   861                                  	;rol	ax, 1
   862                                  	;xchg	al, ah
   863                                  	;and	ah, 1
   864 0000059E 66C1E807                	shr	ax, 7
   865 000005A2 84F6                    	test    dh, dh
   866 000005A4 7903                    	jns     short VibUp
   867 000005A6 66F7D8                  	neg     ax
   868                                  VibUp:          
   869 000005A9 66034710                	add     ax, [edi+TrackInfo.Period]
   870 000005AD 6689C3                  	mov	bx, ax
   871                                  	;movzx	ebx, ax
   872 000005B0 6683FB71                	cmp     bx, 113
   873                                  	;cmp	bx, 113
   874 000005B4 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   875 000005B8 7D06                    	jge     short NoLoVib
   876                                  	;mov	bx, 113
   877 000005BA 66BB1C00                	mov	bx, 28	; 01/10/2017
   878 000005BE EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   879                                  NoLoVib:        
   880 000005C0 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   881                                  	;cmp	bx, 856
   882 000005C5 7E04                    	jle     short NoHiVib
   883                                  	;mov	bx, 856
   884 000005C7 66BB600D                	mov	bx, 3424 ; 01/10/2017
   885                                  NoHiVib:        
   886 000005CB 6601DB                  	add     bx, bx
   887                                  	;mov	ax, [PitchTable+bx]
   888 000005CE 668B83[CE150000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   889 000005D5 66894712                	mov     [edi+TrackInfo.Pitch], ax
   890 000005D9 C3                      	retn
   891                                  efxtoneslide:
   892                                  PortSlide:
   893 000005DA E812000000              	call    VolSlide
   894 000005DF 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   895 000005E2 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   896                                  efxvibslide:
   897                                  VibSlide:
   898 000005E7 E805000000              	call    VolSlide
   899 000005EC 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   900 000005EF EB8D                    	jmp     short Vibrato  ; efxvibrato2
   901                                  efxvolslide:
   902                                  VolSlide:
   903 000005F1 88D6                    	mov     dh, dl
   904 000005F3 80E20F                  	and     dl, 0Fh
   905 000005F6 C0EE04                  	shr     dh, 4
   906 000005F9 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   907 000005FC 28D0                    	sub     al, dl
   908 000005FE 7D02                    	jge     short NoLoVol
   909 00000600 30C0                    	xor     al, al
   910                                  NoLoVol:        
   911 00000602 00F0                    	add     al, dh
   912 00000604 3C40                    	cmp     al, 64
   913 00000606 7602                    	jbe     short NoHiVol
   914 00000608 B040                    	mov     al, 64
   915                                  NoHiVol:        
   916 0000060A 88470E                  	mov     [edi+TrackInfo.Volume], al
   917 0000060D C3                      	retn
   918                                  
   919                                  efxtremolo2:
   920                                  	; 01/10/2017 (TMODPLAY.ASM)
   921                                  Tremolo:
   922 0000060E 88D6                    	mov     dh, dl
   923 00000610 6681E20FF0              	and     dx, 0F00Fh
   924 00000615 C0EE02                  	shr     dh, 2
   925 00000618 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
   926 0000061B 00771B                  	add	[edi+TrackInfo.TremPos], dh
   927 0000061E 88DE                    	mov	dh, bl
   928 00000620 C0EB02                  	shr     bl, 2
   929                                  	; 01/10/2017 - TRDOS 386
   930                                  	;and	bx, 1Fh
   931 00000623 83E31F                  	and	ebx, 1Fh 
   932                                  	;mov	al, [SinTable+bx]
   933 00000626 8A83[BC0D0000]          	mov     al, [SinTable+ebx]
   934 0000062C F6E2                    	mul     dl
   935 0000062E 66C1E806                	shr	ax, 6
   936 00000632 84F6                    	test    dh, dh
   937 00000634 7D03                    	jge	short Tremolo_1 ; efxtremolof2
   938 00000636 66F7D8                  	neg     ax
   939                                  efxtremolof2:
   940                                  Tremolo_1:      
   941 00000639 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
   942 0000063C 00E0                    	add     al, ah
   943 0000063E 7D02                    	jge     short Tremolo_2 ; efxtremolof3
   944 00000640 30C0                    	xor     al, al
   945                                  efxtremolof3:
   946                                  Tremolo_2:       
   947 00000642 3C40                    	cmp     al, 64 ; 40h
   948 00000644 7E02                    	jle     short Tremolo_3 ; efxtremolof4
   949 00000646 B040                    	mov     al, 64 ; 40h
   950                                  efxtremolof4:
   951                                  Tremolo_3:       
   952 00000648 28E0                    	sub	al, ah  ; ****** 
   953 0000064A 88470F                  	mov     [edi+TrackInfo.VolDiff], al
   954 0000064D C3                      	retn	
   955                                  
   956                                  ;--------------------------------------------------------------------------
   957                                  ; readchannel - read the next note event from the pattern sheet
   958                                  ;--------------------------------------------------------------------------
   959                                  ;
   960                                  ;--------------------------------------------------------------------------
   961                                  ; GetTrack:   Get the next Note from a pattern.
   962                                  ;  In:
   963                                  ;    ds:di -  Track info Address.
   964                                  ;    es:si -  Pattern Note Address.
   965                                  ; Out:
   966                                  ;    es:si -  The Next Pattern Note address.
   967                                  ;--------------------------------------------------------------------------
   968                                  
   969                                  ; esi = Pattern note address
   970                                  ; edi = Track info address
   971                                  
   972                                  readchannel:
   973                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
   974 0000064E 66AD                    	lodsw
   975 00000650 86C4                    	xchg    al, ah
   976 00000652 88E3                    	mov	bl, ah
   977 00000654 80E40F                  	and     ah, 0Fh
   978 00000657 6689C1                  	mov     cx, ax
   979 0000065A 66AD                    	lodsw
   980 0000065C 86C4                    	xchg    al, ah
   981 0000065E 88E7                    	mov     bh, ah
   982 00000660 80E40F                  	and     ah, 0Fh
   983 00000663 6689C2                  	mov     dx, ax
   984 00000666 66895714                	mov     [edi+TrackInfo.Effect], dx
   985                                  	; 01/10/2017 - TRDOS 386
   986                                  	;and	bl, 0F0h
   987 0000066A 81E3F0FF0000            	and	ebx, 0FFF0h
   988 00000670 C0EF04                  	shr     bh, 4
   989 00000673 08FB                    	or      bl, bh
   990 00000675 7446                    	je      short SetPeriod
   991                                  SetSample:
   992 00000677 30FF                    	xor	bh, bh
   993                                  	;and	ebx, 0FFh
   994 00000679 FECB                    	dec     bl
   995 0000067B 01DB                    	add     ebx, ebx
   996 0000067D 668B83[90150000]        	mov     ax, [ModInfo.SampVol+ebx]
   997 00000684 88470E                  	mov     [edi+TrackInfo.Volume], al
   998 00000687 668B83[5A140000]        	mov     ax, [ModInfo.SampOfs+ebx]
   999 0000068E 668907                  	mov     [edi+TrackInfo.Samples], ax
  1000 00000691 668B83[98140000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1001 00000698 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1002 0000069C 668B83[D6140000]        	mov     ax, [ModInfo.SampLen+ebx]
  1003 000006A3 66894708                	mov     [edi+TrackInfo.Len], ax
  1004 000006A7 668B83[14150000]        	mov     ax, [ModInfo.SampRep+ebx]
  1005 000006AE 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1006 000006B2 668B83[52150000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1007 000006B9 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1008                                  SetPeriod:      
  1009 000006BD 6685C9                  	test    cx, cx
  1010 000006C0 7425                    	jz      short SetEffect
  1011                                  
  1012 000006C2 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1013                                  	
  1014 000006C6 80FE03                  	cmp     dh, 03h
  1015                                  	;je	short SetEffect
  1016 000006C9 7428                    	je	short efxtoneporta ; 01/10/2017
  1017                                  
  1018 000006CB 66894F10                	mov     [edi+TrackInfo.Period], cx
  1019                                  	;movzx	ebx, cx
  1020 000006CF 6689CB                  	mov     bx, cx
  1021 000006D2 6601DB                  	add     bx, bx
  1022                                  	;mov	ax, [PitchTable+bx]
  1023 000006D5 668B83[CE150000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1024 000006DC 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1025 000006E0 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1026                                  SetEffect:
  1027                                  	;test	dx, dx
  1028                                  	;je	short InitNone
  1029                                  	;cmp	dh, 00h
  1030                                  	;je	InitArpeggio
  1031                                  	;cmp	dh, 03h
  1032                                  	;je	short InitTonePort
  1033                                  	;cmp	dh, 04h
  1034                                  	;je	short InitVibrato
  1035                                  	;cmp	dh, 09h
  1036                                  	;je	short SampleOfs
  1037                                  	;cmp	dh, 0Bh
  1038                                  	;je	short PosJump
  1039                                  	;cmp	dh, 0Ch
  1040                                  	;je	short SetVolume
  1041                                  	;cmp	dh, 0Dh
  1042                                  	;je	short Break
  1043                                  	;cmp	dh, 0Fh
  1044                                  	;je	SetSpeed
  1045                                  	;retn
  1046                                  
  1047                                  	; 01/10/2017 (TMODPLAY.ASM)
  1048                                  	
  1049                                  	; dx = [di+TrackInfo.Effect]
  1050                                  	
  1051 000006E7 0FB6C6                  	movzx	eax, dh
  1052 000006EA 240F                    	and	al, 0Fh
  1053 000006EC FF2485[940C0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1054                                  ;efxnull:
  1055                                  ;InitNone:
  1056                                  ;	retn
  1057                                  efxtoneporta:
  1058                                  	; 01/10/2017
  1059                                  	; cx = period
  1060                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1061                                  InitTonePort:
  1062 000006F3 84D2                    	test    dl, dl
  1063 000006F5 7503                    	jnz     short SetPortParm
  1064 000006F7 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1065                                  SetPortParm:    
  1066 000006FA 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1067 000006FD 66895714                	mov     [edi+TrackInfo.Effect], dx
  1068 00000701 C3                      	retn
  1069                                  efxvibrato:
  1070                                  InitVibrato:
  1071 00000702 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1072 00000705 88C4                    	mov     ah, al
  1073                                  	;and	al, 0Fh
  1074                                  	;and	ah, 0F0h
  1075 00000707 66250FF0                	and	ax, 0F00Fh
  1076 0000070B F6C20F                  	test    dl, 0Fh
  1077 0000070E 7502                    	jne     short OkDepth
  1078 00000710 08C2                    	or      dl, al
  1079                                  OkDepth:        
  1080 00000712 F6C2F0                  	test    dl, 0F0h
  1081 00000715 7502                    	jnz     short OkRate
  1082 00000717 08E2                    	or      dl, ah
  1083                                  OkRate:         
  1084 00000719 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1085 0000071C 66895714                	mov     [edi+TrackInfo.Effect], dx
  1086 00000720 6685C9                  	test    cx, cx
  1087 00000723 7404                    	jz      short OkPos
  1088 00000725 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1089                                  OkPos:          
  1090 00000729 C3                      	retn
  1091                                  efxsampoffset:
  1092                                  	; 01/10/2017 ; *******
  1093                                  SampleOfs:         
  1094                                  ;	test    dl, dl
  1095                                  ;	jnz     short SetSampleOfs
  1096                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1097                                  ;SetSampleOfs:
  1098                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1099 0000072A 88D6                    	mov     dh, dl
  1100 0000072C 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1101 00000732 895704                  	mov     [edi+TrackInfo.Position], edx
  1102 00000735 C3                      	retn
  1103                                  efxpattjump:
  1104                                  PosJump:
  1105 00000736 8815[90810000]          	mov     [OrderPos], dl
  1106 0000073C C605[94810000]40        	mov     byte [Row], 64
  1107 00000743 C3                      	retn
  1108                                  efxsetvolume:
  1109                                  SetVolume:
  1110 00000744 80FA40                  	cmp     dl, 64
  1111 00000747 7602                    	jbe     short OkVol
  1112 00000749 B240                    	mov     dl, 64
  1113                                  OkVol:
  1114                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1115 0000074B 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1116                                  	;mov	[edi+TrackInfo.Volume], dl
  1117 0000074D 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1118 00000751 C3                      	retn
  1119                                  efxbreak:
  1120                                  Break:
  1121 00000752 88D6                    	mov     dh, dl
  1122 00000754 80E20F                  	and     dl, 0Fh
  1123 00000757 C0EE04                  	shr     dh, 4
  1124 0000075A 00F6                    	add     dh, dh
  1125 0000075C 00F2                    	add     dl, dh
  1126 0000075E C0E602                  	shl     dh, 2
  1127 00000761 00F2                    	add     dl, dh
  1128 00000763 8815[95810000]          	mov     [BreakRow], dl
  1129 00000769 C605[94810000]40        	mov     byte [Row], 64
  1130 00000770 C3                      	retn
  1131                                  efxsetspeed:
  1132                                  SetSpeed:
  1133 00000771 84D2                    	test    dl,dl
  1134 00000773 7432                    	je      Skip
  1135 00000775 80FA1F                  	cmp     dl,31
  1136 00000778 770D                    	ja      short SetBpm
  1137                                  SetTempo:       
  1138 0000077A 8815[91810000]          	mov     [Tempo], dl
  1139 00000780 8815[92810000]          	mov     [TempoWait], dl
  1140 00000786 C3                      	retn
  1141                                  SetBpm:
  1142 00000787 8815[93810000]          	mov     [Bpm], dl
  1143 0000078D B067                    	mov     al, 103
  1144 0000078F F6E2                    	mul     dl
  1145 00000791 88E3                    	mov     bl, ah
  1146 00000793 30FF                    	xor     bh, bh
  1147 00000795 66A1[E00D0000]          	mov     ax, [MixSpeed]
  1148 0000079B 6631D2                  	xor     dx, dx
  1149 0000079E 66F7F3                  	div     bx
  1150 000007A1 66A3[96810000]          	mov     [BpmSamples], ax
  1151                                  Skip:           
  1152 000007A7 C3                      	retn
  1153                                  efxarpeggio:
  1154                                  	; 01/10/2017
  1155 000007A8 84D2                    	test    dl, dl
  1156                                  	;je	efxnull
  1157 000007AA 74FB                    	je	short Skip
  1158                                  InitArpeggio:
  1159 000007AC 88D6                    	mov     dh, dl
  1160 000007AE 80E20F                  	and     dl, 0Fh
  1161 000007B1 C0EE04                  	shr     dh, 4
  1162                                  	; 01/10/2017
  1163                                  	;mov	cx, 36
  1164 000007B4 66B95400                	mov	cx, 84 ; 84 notes/periods
  1165 000007B8 31DB                    	xor     ebx, ebx
  1166 000007BA 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1167                                  gt_ScanPeriod:
  1168                                  	;cmp	ax, [PeriodTable+bx]
  1169 000007BE 663B83[140D0000]        	cmp	ax, [PeriodTable+ebx]
  1170 000007C5 7306                    	jae     short SetArp
  1171 000007C7 6683C302                	add     bx, 2
  1172 000007CB E2F1                    	loop    gt_ScanPeriod
  1173                                  SetArp:         
  1174 000007CD 6601D2                  	add     dx, dx
  1175 000007D0 00DE                    	add     dh, bl
  1176 000007D2 00DA                    	add     dl, bl
  1177                                  	; 01/10/2017
  1178                                  	;mov	bx, [PeriodTable+bx]
  1179 000007D4 668B9B[140D0000]        	mov	bx, [PeriodTable+ebx]
  1180                                  	;add	bx, bx
  1181 000007DB 01DB                    	add	ebx, ebx
  1182                                  	;mov	ax, [PitchTable+bx]
  1183 000007DD 668B83[CE150000]        	mov	ax, [PitchTable+ebx]
  1184 000007E4 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1185 000007E8 88F3                    	mov     bl, dh
  1186 000007EA 30FF                    	xor     bh, bh
  1187 000007EC 668B9B[140D0000]        	mov	bx, [PeriodTable+ebx]
  1188                                  	;add	bx, bx
  1189 000007F3 01DB                    	add	ebx, ebx
  1190                                  	;mov	ax, [PitchTable+bx]
  1191 000007F5 668B83[CE150000]        	mov	ax, [PitchTable+ebx]
  1192 000007FC 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1193 00000800 88D3                    	mov     bl, dl
  1194 00000802 30FF                    	xor     bh, bh
  1195 00000804 668B9B[140D0000]        	mov	bx, [PeriodTable+ebx]
  1196                                  	;add	bx, bx
  1197 0000080B 01DB                    	add	ebx, ebx
  1198                                  	;mov	ax, [PitchTable+bx]
  1199 0000080D 668B83[CE150000]        	mov	ax, [PitchTable+ebx]
  1200 00000814 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1201 00000818 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1202 0000081E C3                      	retn
  1203                                  
  1204                                  efxtremolo:
  1205                                  	; 01/10/2017 (TMODPLAY.ASM)
  1206                                  InitTremolo:
  1207 0000081F 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1208 00000822 88C4                    	mov     ah, al
  1209 00000824 66250FF0                	and     ax, 0F00Fh
  1210 00000828 F6C20F                  	test    dl, 0Fh
  1211 0000082B 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1212 0000082D 08C2                    	or      dl, al
  1213                                  efxtremolof0:
  1214                                  InitTremolo_1: 
  1215 0000082F F6C2F0                  	test    dl, 0F0h
  1216 00000832 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1217 00000834 08E2                    	or      dl, ah
  1218                                  efxtremolof1:
  1219                                  InitTremolo_2:
  1220 00000836 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1221 00000839 66895714                	mov     [edi+TrackInfo.Effect], dx
  1222 0000083D C3                      	retn
  1223                                  
  1224                                  ;--------------------------------------------------------------------------
  1225                                  ; pollmodule - polls the module player
  1226                                  ;--------------------------------------------------------------------------
  1227                                  ;--------------------------------------------------------------------------
  1228                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1229                                  ;--------------------------------------------------------------------------
  1230                                  
  1231                                  pollmodule:
  1232                                  UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1233 0000083E FE0D[92810000]          	dec     byte [TempoWait]
  1234 00000844 7417                    	jz      short GetTracks
  1235                                  
  1236                                  	;mov	ecx, NumTracks
  1237 00000846 0FB70D[750F0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1238 0000084D BF[A6810000]            	mov	edi, Tracks
  1239                                  BeatTracks:
  1240 00000852 E86EFCFFFF              	call	BeatTrack	
  1241 00000857 83C726                  	add	edi, TrackInfo.size
  1242 0000085A E2F6                    	loop	BeatTracks
  1243 0000085C C3                      	retn
  1244                                  GetTracks:
  1245 0000085D A0[91810000]            	mov     al, [Tempo]
  1246 00000862 A2[92810000]            	mov     [TempoWait], al
  1247                                  
  1248 00000867 8B35[A2810000]          	mov	esi, [Note]
  1249 0000086D 803D[94810000]40        	cmp     byte [Row], 64
  1250 00000874 7268                    	jb      short NoPattWrap
  1251                                  
  1252 00000876 8B35[56140000]          	mov	esi, [ModInfo.Patterns]
  1253 0000087C 8A1D[90810000]          	mov     bl, [OrderPos]
  1254 00000882 3A1D[D4130000]          	cmp     bl, [ModInfo.OrderLen]
  1255 00000888 7214                    	jb      short NoOrderWrap
  1256 0000088A 8A1D[D5130000]          	mov     bl, [ModInfo.ReStart]
  1257 00000890 881D[90810000]          	mov     [OrderPos], bl
  1258 00000896 3A1D[D4130000]          	cmp     bl, [ModInfo.OrderLen]
  1259 0000089C 7364                    	jae     short NoUpdate
  1260                                  NoOrderWrap:    
  1261                                  	;xor	bh, bh
  1262 0000089E 81E3FF000000            	and	ebx, 0FFh
  1263 000008A4 8A9B[D6130000]          	mov     bl, [ModInfo.Order+ebx]
  1264                                  	; 05/10/2017
  1265                                  	;shl	ebx, 10 ; *1024
  1266 000008AA 8A0D[740F0000]          	mov	cl, [pattern_shift] ; 10 or 11
  1267 000008B0 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1268                                  	;
  1269 000008B2 01DE                    	add     esi, ebx
  1270 000008B4 8A1D[95810000]          	mov     bl, [BreakRow]
  1271 000008BA 881D[94810000]          	mov     [Row], bl
  1272                                  	;xor	bh, bh
  1273 000008C0 81E3FF000000            	and	ebx, 0FFh
  1274 000008C6 883D[95810000]          	mov     [BreakRow], bh ; 0
  1275 000008CC 66C1E304                	shl     bx, 4
  1276 000008D0 01DE                    	add     esi, ebx
  1277 000008D2 8935[A2810000]          	mov     [Note], esi
  1278 000008D8 FE05[90810000]          	inc     byte [OrderPos]
  1279                                  NoPattWrap:     
  1280 000008DE FE05[94810000]          	inc     byte [Row]
  1281                                  
  1282                                  	;cld
  1283                                  	;mov	ecx, NumTracks
  1284 000008E4 0FB70D[750F0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1285 000008EB BF[A6810000]            	mov	edi, Tracks
  1286                                  GetTracks_next:
  1287 000008F0 51                      	push	ecx	
  1288 000008F1 E858FDFFFF              	call	GetTrack
  1289 000008F6 59                      	pop	ecx
  1290 000008F7 83C726                  	add	edi, TrackInfo.size
  1291 000008FA E2F4                    	loop	GetTracks_next
  1292                                  
  1293 000008FC 8935[A2810000]          	mov     [Note], esi
  1294                                  NoUpdate:
  1295 00000902 C3                      	retn
  1296                                  
  1297                                  ;--------------------------------------------------------------------------
  1298                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1299                                  ;  In:
  1300                                  ;   ds:si -  Track Info Address.
  1301                                  ;   ds:di -  Buffer Address.
  1302                                  ;    cx   -  Buffer Size.
  1303                                  ;--------------------------------------------------------------------------
  1304                                  
  1305                                  ; esi = Track info address
  1306                                  ; edi = Buffer address
  1307                                  ; ecx = Buffer size
  1308                                  
  1309                                  MixTrack:
  1310 00000903 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1311 00000908 7752                    	ja      short MixLooped
  1312                                  MixNonLooped:   
  1313 0000090A 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1314 0000090C 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1315 0000090F 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1316 00000913 52                      	push    edx
  1317 00000914 56                      	push    esi
  1318 00000915 01D3                    	add     ebx, edx
  1319 00000917 01D5                    	add     ebp, edx
  1320 00000919 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1321                                  	; 01/10/2017
  1322                                  	;mov	al, [esi+TrackInfo.Volume]
  1323 0000091D 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1324                                  	; ah = [esi+TrackInfo.VolDiff]
  1325 00000921 00E0                    	add	al, ah ; ****** 
  1326 00000923 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1327 00000927 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1328 0000092A 89DE                    	mov     esi, ebx
  1329 0000092C 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1330 0000092E 88C7                    	mov     bh, al
  1331 00000930 88D0                    	mov     al, dl
  1332 00000932 88F2                    	mov     dl, dh
  1333                                  	;xor	dh, dh
  1334 00000934 81E2FF000000            	and	edx, 0FFh
  1335                                  nlMixSamp:      
  1336 0000093A 39EE                    	cmp     esi, ebp
  1337 0000093C 7311                    	jae     short nlMixBye
  1338 0000093E 8A1E                    	mov     bl, [esi]
  1339                                  	;mov	bl, [VolTable+bx]
  1340 00000940 8A9B[90300000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1341 00000946 001F                    	add     [edi], bl
  1342 00000948 47                      	inc     edi
  1343 00000949 00C4                    	add     ah, al
  1344 0000094B 11D6                    	adc     esi, edx
  1345 0000094D E2EB                    	loop    nlMixSamp
  1346                                  nlMixBye:       
  1347 0000094F 89F3                    	mov     ebx, esi
  1348 00000951 5E                      	pop     esi
  1349 00000952 5A                      	pop     edx
  1350 00000953 29D3                    	sub     ebx, edx
  1351 00000955 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1352 00000958 88661D                  	mov     [esi+TrackInfo.Error], ah
  1353 0000095B C3                      	retn
  1354                                  MixLooped:
  1355 0000095C 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1356 0000095E 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1357 00000961 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1358 00000965 892D[9E810000]          	mov     [BufRep], ebp
  1359                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1360 0000096B 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1361 0000096F 52                      	push    edx
  1362 00000970 56                      	push    esi
  1363 00000971 01D3                    	add     ebx, edx
  1364 00000973 01D5                    	add     ebp, edx
  1365 00000975 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1366                                  	; 01/10/2017
  1367                                  	;mov	al, [esi+TrackInfo.Volume]
  1368 00000979 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1369                                  	; ah = [esi+TrackInfo.VolDiff]
  1370 0000097D 00E0                    	add	al, ah ; ****** 
  1371 0000097F C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1372 00000983 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1373                                  	;mov	si, bx
  1374 00000986 89DE                    	mov	esi, ebx ; 04/09/2017
  1375 00000988 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1376 0000098A 88C7                    	mov     bh, al
  1377 0000098C 88D0                    	mov     al, dl
  1378 0000098E 88F2                    	mov     dl, dh
  1379                                  	;xor	dh, dh
  1380 00000990 81E2FF000000            	and	edx, 0FFh
  1381                                  lpMixSamp:      
  1382 00000996 39EE                    	cmp     esi, ebp
  1383 00000998 7206                    	jb      short lpMixNow
  1384 0000099A 2B35[9E810000]          	sub     esi, [BufRep]
  1385                                  lpMixNow:       
  1386 000009A0 8A1E                    	mov     bl, [esi]
  1387                                  	;mov	bl, [VolTable+bx]
  1388 000009A2 8A9B[90300000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1389 000009A8 001F                    	add     [edi], bl
  1390 000009AA 47                      	inc     edi
  1391 000009AB 00C4                    	add     ah, al
  1392 000009AD 11D6                    	adc	esi, edx
  1393 000009AF E2E5                    	loop    lpMixSamp
  1394                                  lpMixBye:       
  1395                                  ;	mov     ebx, esi
  1396                                  ;	pop     esi
  1397                                  ;	pop     edx
  1398                                  ;	sub     ebx, edx
  1399                                  ;	mov     [esi+TrackInfo.Position], ebx
  1400                                  ;	mov     [esi+TrackInfo.Error], ah
  1401                                  ;	retn
  1402 000009B1 EB9C                    	jmp	short nlMixBye
  1403                                  
  1404                                  ;--------------------------------------------------------------------------
  1405                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1406                                  ;  In:
  1407                                  ;    Buffer  - Buffer Address.
  1408                                  ;    Count   - Buffer Size.
  1409                                  ;--------------------------------------------------------------------------
  1410                                  
  1411                                  mixpoll:
  1412                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1413                                  	; edi = buffer address
  1414                                  	; ebx = count
  1415                                  
  1416 000009B3 60                      	pushad
  1417                                  
  1418                                  	;cld
  1419                                  NextChunk:      
  1420 000009B4 66833D[9C810000]00      	cmp     word [BufLen], 0
  1421 000009BC 754A                    	jne     short CopyChunk
  1422                                  
  1423 000009BE 53                      	push    ebx
  1424 000009BF 57                      	push    edi
  1425                                  MixChunk:       
  1426 000009C0 BF[90710000]            	mov	edi, MixBuffer
  1427 000009C5 0FB70D[96810000]        	movzx	ecx, word [BpmSamples]
  1428                                  	;mov	cx, [BpmSamples]
  1429 000009CC 893D[98810000]          	mov     [BufPtr], edi
  1430 000009D2 66890D[9C810000]        	mov     [BufLen], cx
  1431                                  
  1432 000009D9 B080                    	mov     al, 80h
  1433 000009DB F3AA                    	rep     stosb
  1434                                  
  1435                                  	;mov	cx, NumTracks
  1436                                  	;mov	cl, NumTracks ; 01/10/2017
  1437 000009DD 8A0D[750F0000]          	mov	cl, [numtracks] ; 06/10/2017
  1438 000009E3 BE[80810000]            	mov	esi, Tracks - TrackInfo.size
  1439                                  GetSamples_next:
  1440 000009E8 51                      	push	ecx
  1441 000009E9 83C626                  	add	esi, TrackInfo.size
  1442 000009EC 668B0D[9C810000]        	mov	cx, [BufLen]
  1443 000009F3 8B3D[98810000]          	mov	edi, [BufPtr]
  1444 000009F9 E805FFFFFF              	call	MixTrack
  1445 000009FE 59                      	pop	ecx
  1446 000009FF E2E7                    	loop	GetSamples_next	
  1447                                  
  1448 00000A01 E838FEFFFF              	call    UpdateTracks
  1449                                  
  1450 00000A06 5F                      	pop     edi
  1451 00000A07 5B                      	pop     ebx
  1452                                  CopyChunk:      
  1453                                  	;mov	cx, [BufLen]
  1454 00000A08 0FB70D[9C810000]        	movzx	ecx, word [BufLen]
  1455 00000A0F 39D9                    	cmp	ecx, ebx
  1456                                  	;cmp	cx, bx
  1457 00000A11 7602                    	jbe     short MoveChunk
  1458                                  	;mov	cx, bx
  1459 00000A13 89D9                    	mov     ecx, ebx
  1460                                  MoveChunk:
  1461 00000A15 8B35[98810000]          	mov     esi, [BufPtr]
  1462 00000A1B 010D[98810000]          	add     [BufPtr], ecx
  1463 00000A21 66290D[9C810000]        	sub     [BufLen], cx
  1464 00000A28 29CB                    	sub     ebx, ecx
  1465 00000A2A F3A4                    	rep     movsb
  1466 00000A2C 85DB                    	test    ebx, ebx
  1467 00000A2E 7584                    	jnz     short NextChunk
  1468                                  
  1469 00000A30 61                      	popad
  1470 00000A31 C3                      	retn
  1471                                  
  1472                                  ;--------------------------------------------------------------------------
  1473                                  ; StartPlaying: Initializes the Sound System.
  1474                                  ;  In:
  1475                                  ;   Module Information Resources.
  1476                                  ;--------------------------------------------------------------------------
  1477                                  
  1478                                  StartPlaying:
  1479 00000A32 60                      	pushad
  1480                                  SetModParms:    
  1481 00000A33 C605[90810000]00        	mov     byte [OrderPos], 0
  1482 00000A3A C605[91810000]06        	mov     byte [Tempo], DefTempo
  1483 00000A41 C605[92810000]06        	mov     byte [TempoWait], DefTempo
  1484 00000A48 C605[93810000]7D        	mov     byte [Bpm], DefBpm
  1485 00000A4F C605[94810000]40        	mov     byte [Row], 64
  1486 00000A56 C605[95810000]00        	mov     byte [BreakRow], 0
  1487 00000A5D 66A1[E00D0000]          	mov     ax, [MixSpeed]
  1488 00000A63 31D2                    	xor     edx, edx
  1489 00000A65 66BB3200                	mov     bx, 24*DefBpm/60
  1490 00000A69 66F7F3                  	div     bx
  1491 00000A6C 66A3[96810000]          	mov     [BpmSamples], ax
  1492                                  ClearTracks:    
  1493 00000A72 BF[A6810000]            	mov     edi, Tracks
  1494                                  	; 06/10/2017
  1495                                  	;mov	ecx, NumTracks*TrackInfo.size
  1496 00000A77 B826000000              	mov	eax, TrackInfo.size
  1497 00000A7C 0FB70D[750F0000]        	movzx	ecx, word [numtracks]
  1498 00000A83 F7E1                    	mul	ecx
  1499 00000A85 89C1                    	mov	ecx, eax
  1500 00000A87 31C0                    	xor	eax, eax
  1501                                  	;cld
  1502 00000A89 F3AA                    	rep     stosb
  1503                                  
  1504 00000A8B A3[98810000]            	mov     [BufPtr], eax
  1505 00000A90 66A3[9C810000]          	mov     [BufLen], ax
  1506                                  MakePitch:
  1507 00000A96 66B80021                	mov     ax, MidCRate
  1508 00000A9A 66BBAC01                	mov     bx, 428
  1509 00000A9E 66F7E3                  	mul     bx
  1510 00000AA1 66F735[E00D0000]        	div     word [MixSpeed]
  1511 00000AA8 30F6                    	xor     dh, dh
  1512 00000AAA 88E2                    	mov     dl, ah
  1513 00000AAC 88C4                    	mov     ah, al
  1514 00000AAE 30C0                    	xor     al, al
  1515                                  	;mov	cx, 857
  1516 00000AB0 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1517 00000AB4 31DB                    	xor     ebx, ebx
  1518 00000AB6 BF[CE150000]            	mov     edi, PitchTable
  1519                                  PitchLoop:      
  1520 00000ABB 50                      	push    eax
  1521 00000ABC 52                      	push    edx
  1522 00000ABD 6639DA                  	cmp     dx, bx
  1523 00000AC0 7303                    	jae     short NoDiv
  1524 00000AC2 66F7F3                  	div     bx
  1525                                  NoDiv:          
  1526 00000AC5 66AB                    	stosw
  1527 00000AC7 5A                      	pop     edx
  1528 00000AC8 58                      	pop     eax
  1529 00000AC9 43                      	inc     ebx
  1530 00000ACA E2EF                    	loop    PitchLoop
  1531                                  MakeVolume:     
  1532 00000ACC 66B90041                	mov     cx, 16640
  1533 00000AD0 89CB                    	mov     ebx, ecx
  1534                                  VolLoop:
  1535 00000AD2 4B                      	dec     ebx
  1536 00000AD3 88D8                    	mov     al, bl
  1537 00000AD5 F6EF                    	imul    bh
  1538 00000AD7 88A3[90300000]          	mov     [VolTable+ebx], ah
  1539 00000ADD E2F3                    	loop    VolLoop
  1540                                  
  1541 00000ADF 61                      	popad
  1542 00000AE0 C3                      	retn
  1543                                  
  1544                                  ;--------------------------------------------------------------------------
  1545                                  ; StopPlaying: ShutDown the Sound System.
  1546                                  ;--------------------------------------------------------------------------
  1547                                  
  1548                                  StopPlaying:
  1549                                  	; 19/06/2017
  1550                                  	; Stop Playing
  1551                                  	sys	_audio, 0700h
  1551                              <1> 
  1551                              <1> 
  1551                              <1> 
  1551                              <1> 
  1551                              <1>  %if %0 >= 2
  1551 00000AE1 BB00070000          <1>  mov ebx, %2
  1551                              <1>  %if %0 >= 3
  1551                              <1>  mov ecx, %3
  1551                              <1>  %if %0 = 4
  1551                              <1>  mov edx, %4
  1551                              <1>  %endif
  1551                              <1>  %endif
  1551                              <1>  %endif
  1551 00000AE6 B820000000          <1>  mov eax, %1
  1551                              <1> 
  1551 00000AEB CD40                <1>  int 40h
  1552                                  	; Cancel callback service (for user)
  1553                                  	sys	_audio, 0900h
  1553                              <1> 
  1553                              <1> 
  1553                              <1> 
  1553                              <1> 
  1553                              <1>  %if %0 >= 2
  1553 00000AED BB00090000          <1>  mov ebx, %2
  1553                              <1>  %if %0 >= 3
  1553                              <1>  mov ecx, %3
  1553                              <1>  %if %0 = 4
  1553                              <1>  mov edx, %4
  1553                              <1>  %endif
  1553                              <1>  %endif
  1553                              <1>  %endif
  1553 00000AF2 B820000000          <1>  mov eax, %1
  1553                              <1> 
  1553 00000AF7 CD40                <1>  int 40h
  1554                                  	; Deallocate Audio Buffer (for user)
  1555                                  	sys	_audio, 0A00h
  1555                              <1> 
  1555                              <1> 
  1555                              <1> 
  1555                              <1> 
  1555                              <1>  %if %0 >= 2
  1555 00000AF9 BB000A0000          <1>  mov ebx, %2
  1555                              <1>  %if %0 >= 3
  1555                              <1>  mov ecx, %3
  1555                              <1>  %if %0 = 4
  1555                              <1>  mov edx, %4
  1555                              <1>  %endif
  1555                              <1>  %endif
  1555                              <1>  %endif
  1555 00000AFE B820000000          <1>  mov eax, %1
  1555                              <1> 
  1555 00000B03 CD40                <1>  int 40h
  1556                                  	; Disable Audio Device
  1557                                  	sys	_audio, 0C00h
  1557                              <1> 
  1557                              <1> 
  1557                              <1> 
  1557                              <1> 
  1557                              <1>  %if %0 >= 2
  1557 00000B05 BB000C0000          <1>  mov ebx, %2
  1557                              <1>  %if %0 >= 3
  1557                              <1>  mov ecx, %3
  1557                              <1>  %if %0 = 4
  1557                              <1>  mov edx, %4
  1557                              <1>  %endif
  1557                              <1>  %endif
  1557                              <1>  %endif
  1557 00000B0A B820000000          <1>  mov eax, %1
  1557                              <1> 
  1557 00000B0F CD40                <1>  int 40h
  1558                                  
  1559 00000B11 C3                      	retn
  1560                                  
  1561                                  ;=============================================================================
  1562                                  ; 
  1563                                  ;=============================================================================
  1564                                  
  1565                                  ;dword2str:
  1566                                  ;	; 13/11/2016 - Erdogan Tan 
  1567                                  ;	; eax = dword value
  1568                                  ;	;
  1569                                  ;	call	dwordtohex
  1570                                  ;	mov	[dword_str], edx
  1571                                  ;	mov	[dword_str+4], eax
  1572                                  ;	mov	si, dword_str
  1573                                  ;	retn
  1574                                  
  1575                                  	; 05/03/2017 (TRDOS 386)
  1576                                  	; trdos386.s (unix386.s) - 10/05/2015
  1577                                  	; Convert binary number to hexadecimal string
  1578                                  
  1579                                  ;bytetohex:
  1580                                  ;	; INPUT ->
  1581                                  ;	; 	AL = byte (binary number)
  1582                                  ;	; OUTPUT ->
  1583                                  ;	;	AX = hexadecimal string
  1584                                  ;	;
  1585                                  ;	push	ebx
  1586                                  ;	movzx	ebx, al
  1587                                  ;	shr	bl, 4
  1588                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1589                                  ;	xchg	bl, al
  1590                                  ;	and	bl, 0Fh
  1591                                  ;	mov	ah, [ebx+hex_chars] 
  1592                                  ;	pop	ebx	
  1593                                  ;	retn
  1594                                  
  1595                                  ;wordtohex:
  1596                                  ;	; INPUT ->
  1597                                  ;	; 	AX = word (binary number)
  1598                                  ;	; OUTPUT ->
  1599                                  ;	;	EAX = hexadecimal string
  1600                                  ;	;
  1601                                  ;	push	ebx
  1602                                  ;	xor	ebx, ebx
  1603                                  ;	xchg	ah, al
  1604                                  ;	push	eax
  1605                                  ;	mov	bl, ah
  1606                                  ;	shr	bl, 4
  1607                                  ;	mov	al, [ebx+hex_chars] 	 	
  1608                                  ;	mov	bl, ah
  1609                                  ;	and	bl, 0Fh
  1610                                  ;	mov	ah, [ebx+hex_chars]
  1611                                  ;	shl	eax, 16
  1612                                  ;	pop	eax
  1613                                  ;	pop	ebx
  1614                                  ;	jmp	short bytetohex
  1615                                  
  1616                                  ;dwordtohex:
  1617                                  ;	; INPUT ->
  1618                                  ;	; 	EAX = dword (binary number)
  1619                                  ;	; OUTPUT ->
  1620                                  ;	;	EDX:EAX = hexadecimal string
  1621                                  ;	;
  1622                                  ;	push	eax
  1623                                  ;	shr	eax, 16
  1624                                  ;	call	wordtohex
  1625                                  ;	mov	edx, eax
  1626                                  ;	pop	eax
  1627                                  ;	call	wordtohex
  1628                                  ;	retn
  1629                                  
  1630                                  	; 19/06/2017
  1631                                  	; 05/03/2017 (TRDOS 386)
  1632                                  	; 13/11/2016 - Erdogan Tan
  1633                                  write_audio_dev_info:
  1634                                  	; BUS/DEV/FN
  1635                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1636                                  	; DEV/VENDOR
  1637                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1638                                  
  1639 00000B12 8B35[840F0000]          	mov	esi, [dev_vendor]
  1640 00000B18 6689F0                  	mov	ax, si
  1641 00000B1B 0FB6D8                  	movzx	ebx, al
  1642 00000B1E 88DA                    	mov	dl, bl
  1643 00000B20 80E30F                  	and	bl, 0Fh
  1644 00000B23 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1645 00000B29 A2[270E0000]            	mov	[msgVendorId+3], al
  1646 00000B2E 88D3                    	mov	bl, dl
  1647 00000B30 C0EB04                  	shr	bl, 4
  1648 00000B33 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1649 00000B39 A2[260E0000]            	mov	[msgVendorId+2], al
  1650 00000B3E 88E3                    	mov	bl, ah
  1651 00000B40 88DA                    	mov	dl, bl
  1652 00000B42 80E30F                  	and	bl, 0Fh
  1653 00000B45 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1654 00000B4B A2[250E0000]            	mov	[msgVendorId+1], al
  1655 00000B50 88D3                    	mov	bl, dl
  1656 00000B52 C0EB04                  	shr	bl, 4
  1657 00000B55 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1658 00000B5B A2[240E0000]            	mov	[msgVendorId], al
  1659 00000B60 C1EE10                  	shr	esi, 16
  1660 00000B63 6689F0                  	mov	ax, si
  1661 00000B66 88C3                    	mov	bl, al
  1662 00000B68 88DA                    	mov	dl, bl
  1663 00000B6A 80E30F                  	and	bl, 0Fh
  1664 00000B6D 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1665 00000B73 A2[380E0000]            	mov	[msgDevId+3], al
  1666 00000B78 88D3                    	mov	bl, dl
  1667 00000B7A C0EB04                  	shr	bl, 4
  1668 00000B7D 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1669 00000B83 A2[370E0000]            	mov	[msgDevId+2], al
  1670 00000B88 88E3                    	mov	bl, ah
  1671 00000B8A 88DA                    	mov	dl, bl
  1672 00000B8C 80E30F                  	and	bl, 0Fh
  1673 00000B8F 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1674 00000B95 A2[360E0000]            	mov	[msgDevId+1], al
  1675 00000B9A 88D3                    	mov	bl, dl
  1676 00000B9C C0EB04                  	shr	bl, 4
  1677 00000B9F 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1678 00000BA5 A2[350E0000]            	mov	[msgDevId], al
  1679                                  
  1680 00000BAA 8B35[880F0000]          	mov	esi, [bus_dev_fn]
  1681 00000BB0 C1EE08                  	shr	esi, 8
  1682 00000BB3 6689F0                  	mov	ax, si
  1683 00000BB6 88C3                    	mov	bl, al
  1684 00000BB8 88DA                    	mov	dl, bl
  1685 00000BBA 80E307                  	and	bl, 7 ; bit 0,1,2
  1686 00000BBD 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1687 00000BC3 A2[5C0E0000]            	mov	[msgFncNo+1], al
  1688 00000BC8 88D3                    	mov	bl, dl
  1689 00000BCA C0EB03                  	shr	bl, 3
  1690 00000BCD 88DA                    	mov	dl, bl
  1691 00000BCF 80E30F                  	and	bl, 0Fh
  1692 00000BD2 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1693 00000BD8 A2[4E0E0000]            	mov	[msgDevNo+1], al
  1694 00000BDD 88D3                    	mov	bl, dl
  1695 00000BDF C0EB04                  	shr	bl, 4
  1696 00000BE2 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1697 00000BE8 A2[4D0E0000]            	mov	[msgDevNo], al
  1698 00000BED 88E3                    	mov	bl, ah
  1699 00000BEF 88DA                    	mov	dl, bl
  1700 00000BF1 80E30F                  	and	bl, 0Fh
  1701 00000BF4 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1702 00000BFA A2[420E0000]            	mov	[msgBusNo+1], al
  1703 00000BFF 88D3                    	mov	bl, dl
  1704 00000C01 C0EB04                  	shr	bl, 4
  1705 00000C04 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1706 00000C0A A2[410E0000]            	mov	[msgBusNo], al
  1707                                  
  1708 00000C0F 66A1[900F0000]          	mov	ax, [ac97_io_base]
  1709 00000C15 88C3                    	mov	bl, al
  1710 00000C17 88DA                    	mov	dl, bl
  1711 00000C19 80E30F                  	and	bl, 0Fh
  1712 00000C1C 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1713 00000C22 A2[750E0000]            	mov	[msgIOBaseAddr+3], al
  1714 00000C27 88D3                    	mov	bl, dl
  1715 00000C29 C0EB04                  	shr	bl, 4
  1716 00000C2C 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1717 00000C32 A2[740E0000]            	mov	[msgIOBaseAddr+2], al
  1718 00000C37 88E3                    	mov	bl, ah
  1719 00000C39 88DA                    	mov	dl, bl
  1720 00000C3B 80E30F                  	and	bl, 0Fh
  1721 00000C3E 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1722 00000C44 A2[730E0000]            	mov	[msgIOBaseAddr+1], al
  1723 00000C49 88D3                    	mov	bl, dl
  1724 00000C4B C0EB04                  	shr	bl, 4
  1725 00000C4E 8A83[E20D0000]          	mov	al, [ebx+hex_chars]
  1726 00000C54 A2[720E0000]            	mov	[msgIOBaseAddr], al
  1727                                  
  1728                                  	; 24/11/2016
  1729 00000C59 30E4                    	xor	ah, ah
  1730 00000C5B A0[920F0000]            	mov	al, [ac97_int_ln_reg]
  1731 00000C60 B10A                    	mov	cl, 10
  1732 00000C62 F6F1                    	div	cl
  1733 00000C64 660105[7D0E0000]        	add	[msgIRQ], ax
  1734 00000C6B 20C0                    	and	al, al
  1735 00000C6D 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1736 00000C6F A0[7E0E0000]            	mov	al, [msgIRQ+1]
  1737 00000C74 B420                    	mov	ah, ' '
  1738 00000C76 66A3[7D0E0000]          	mov	[msgIRQ], ax
  1739                                  _w_ac97imsg_:
  1740                                  	; EBX = Message address
  1741                                  	; ECX = Max. message length (or stop on ZERO character)
  1742                                  	;	(1 to 255)
  1743                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1744                                       	sys 	_msg, msgAC97Info, 255, 07h
  1744                              <1> 
  1744                              <1> 
  1744                              <1> 
  1744                              <1> 
  1744                              <1>  %if %0 >= 2
  1744 00000C7C BB[F30D0000]        <1>  mov ebx, %2
  1744                              <1>  %if %0 >= 3
  1744 00000C81 B9FF000000          <1>  mov ecx, %3
  1744                              <1>  %if %0 = 4
  1744 00000C86 BA07000000          <1>  mov edx, %4
  1744                              <1>  %endif
  1744                              <1>  %endif
  1744                              <1>  %endif
  1744 00000C8B B823000000          <1>  mov eax, %1
  1744                              <1> 
  1744 00000C90 CD40                <1>  int 40h
  1745 00000C92 C3                              retn
  1746                                  
  1747                                  ;=============================================================================
  1748                                  ;               preinitialized data
  1749                                  ;=============================================================================
  1750                                  
  1751                                  ;=============================================================================
  1752                                  ; Protracker effects stuff
  1753                                  ;=============================================================================
  1754                                  
  1755                                  ;-----------------------------------------------------------------------------
  1756                                  ; Effect jump tables
  1757                                  ;-----------------------------------------------------------------------------
  1758                                  
  1759 00000C93 90                      align 4
  1760                                  
  1761                                  efxtable:
  1762 00000C94 [A8070000]              	dd      efxarpeggio	; 0 - arpeggio
  1763 00000C98 [D5040000]              	dd      efxnull	; 1 - porta up
  1764 00000C9C [D5040000]              	dd      efxnull	; 2 - porta down
  1765 00000CA0 [F3060000]              	dd      efxtoneporta	; 3 - tone porta
  1766 00000CA4 [02070000]              	dd      efxvibrato	; 4 - vibrato
  1767 00000CA8 [D5040000]              	dd      efxnull		; 5 - tone+slide
  1768 00000CAC [D5040000]              	dd      efxnull		; 6 - vibrato+slide
  1769 00000CB0 [1F080000]              	dd      efxtremolo	; 7 - tremolo
  1770 00000CB4 [D5040000]              	dd      efxnull		; 8 - unused
  1771 00000CB8 [2A070000]              	dd      efxsampoffset	; 9 - sample offset
  1772 00000CBC [D5040000]              	dd      efxnull		; A - volume slide
  1773 00000CC0 [36070000]              	dd      efxpattjump	; B - pattern jump
  1774 00000CC4 [44070000]              	dd      efxsetvolume	; C - set volume
  1775 00000CC8 [52070000]              	dd      efxbreak	; D - break pattern
  1776 00000CCC [D5040000]              	dd      efxnull		; E - extra effects
  1777 00000CD0 [71070000]              	dd      efxsetspeed	; F - set speed
  1778                                  
  1779                                  efxtable2:
  1780 00000CD4 [D6040000]              	dd      efxarpeggio2	; 0 - arpeggio
  1781 00000CD8 [F8040000]              	dd      efxportaup	; 1 - porta up
  1782 00000CDC [1E050000]              	dd      efxportadown	; 2 - porta down
  1783 00000CE0 [45050000]              	dd      efxtoneporta2	; 3 - tone porta
  1784 00000CE4 [7E050000]              	dd      efxvibrato2	; 4 - vibrato
  1785 00000CE8 [DA050000]              	dd      efxtoneslide	; 5 - tone+slide
  1786 00000CEC [E7050000]              	dd      efxvibslide	; 6 - vibrato+slide
  1787 00000CF0 [0E060000]              	dd      efxtremolo2	; 7 - tremolo
  1788 00000CF4 [D5040000]              	dd      efxnull		; 8 - unused
  1789 00000CF8 [D5040000]              	dd      efxnull		; 9 - sample offset
  1790 00000CFC [F1050000]              	dd      efxvolslide	; A - volume slide
  1791 00000D00 [D5040000]              	dd      efxnull		; B - pattern jump
  1792 00000D04 [D5040000]              	dd      efxnull		; C - set volume
  1793 00000D08 [D5040000]              	dd      efxnull		; D - break pattern
  1794 00000D0C [D5040000]              	dd      efxnull		; E - extra effects
  1795 00000D10 [D5040000]              	dd      efxnull		; F - set speed
  1796                                  
  1797                                  ;-----------------------------------------------------------------------------
  1798                                  ; Amiga period table
  1799                                  ;-----------------------------------------------------------------------------
  1800                                  
  1801                                  ;PeriodTable0:	
  1802                                  ;	dw	0
  1803                                  PeriodTable:
  1804 00000D14 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1804 00000D1D 0A000A7009E8086808-
  1804 00000D26 F00780071407       
  1805 00000D2C B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1805 00000D35 050005B80474043404-
  1805 00000D3E F803C0038A03       
  1806 00000D44 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1806 00000D4D 0280025C023A021A02-
  1806 00000D56 FC01E001C501       
  1807 00000D5C AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1807 00000D65 0140012E011D010D01-
  1807 00000D6E FE00F000E200       
  1808 00000D74 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1808 00000D7D 00A00097008F008700-
  1808 00000D86 7F0078007100       
  1809 00000D8C 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1809 00000D95 0050004B0047004300-
  1809 00000D9E 3F003C003800       
  1810 00000DA4 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1810 00000DAD 002800250023002100-
  1810 00000DB6 1F001E001C00       
  1811                                  
  1812                                  ;-----------------------------------------------------------------------------
  1813                                  ; Sinus wave table
  1814                                  ;-----------------------------------------------------------------------------
  1815                                  
  1816                                  SinTable:
  1817 00000DBC 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1817 00000DC5 C5D4E1             
  1818 00000DC8 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1818 00000DD1 E1                 
  1819 00000DD2 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1819 00000DDB 19                 
  1820                                  
  1821 00000DDC 0000                    	dw	0
  1822                                  
  1823                                  ;=============================================================================
  1824                                  ;              AC'97 data
  1825                                  ;=============================================================================
  1826                                  
  1827 00000DDE 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1828 00000DDF 08                      bps:		db 8 ; bits per sample (8 or 16)
  1829                                  Sample_Rate:
  1830 00000DE0 2256                    MixSpeed:	dw 22050 ; Hz
  1831                                  
  1832                                  ; 13/11/2016
  1833 00000DE2 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1833 00000DEB 3941424344454600   
  1834                                  msgAC97Info:	
  1835 00000DF3 0D0A                    		db 0Dh, 0Ah
  1836 00000DF5 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1836 00000DFE 6F20436F6E74726F6C-
  1836 00000E07 6C6572202620436F64-
  1836 00000E10 656320496E666F0D0A 
  1837 00000E19 56656E646F72204944-     		db "Vendor ID: "
  1837 00000E22 3A20               
  1838 00000E24 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1838 00000E2D 6963652049443A20   
  1839 00000E35 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1840 00000E3C 4275733A20              		db "Bus: "
  1841 00000E41 303068204465766963-     msgBusNo:	db "00h Device: "
  1841 00000E4A 653A20             
  1842 00000E4D 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1842 00000E56 696F6E3A20         
  1843 00000E5B 303068                  msgFncNo:	db "00h"
  1844 00000E5E 0D0A                    		db 0Dh, 0Ah
  1845 00000E60 492F4F204261736520-     		db "I/O Base Address: "
  1845 00000E69 416464726573733A20 
  1846 00000E72 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  1846 00000E7B 3A20               
  1847 00000E7D 3030                    msgIRQ:		dw 3030h
  1848 00000E7F 0D0A00                  		db 0Dh, 0Ah, 0
  1849                                  ;msgSampleRate:	db "Sample Rate: "
  1850                                  ;msgHertz:	db "00000 Hz ", 0
  1851                                  ;msg8Bits:	db "8 bits ", 0
  1852                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1853                                  ;msg16Bits:	db "16 bits ", 0
  1854                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1855                                  
  1856                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1857                                  ;codec_id:	   dd 0
  1858                                  ;codec_chip_id:	   dd 0
  1859                                  ;codec_vendor_ids: dw 0
  1860                                  ;codec_chip_ids:   dw 0
  1861                                  
  1862                                  ;dword_str:	dd 30303030h, 30303030h
  1863                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1864                                  
  1865                                  ;=============================================================================
  1866                                  ; Copyright Strings & Messages
  1867                                  ;=============================================================================
  1868                                  
  1869                                  msg_usage:
  1870 00000E82 54696E79204D4F4420-     		db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1870 00000E8B 506C6179657220666F-
  1870 00000E94 72205452444F532033-
  1870 00000E9D 383620627920457264-
  1870 00000EA6 6F67616E2054616E2E-
  1870 00000EAF 20                 
  1871 00000EB0 4F63746F6265722032-     		db	'October 2017.',10,13
  1871 00000EB9 3031372E0A0D       
  1872 00000EBF 75736167653A207469-     		db	'usage: tinyplay filename.mod', 10, 13,0
  1872 00000EC8 6E79706C6179206669-
  1872 00000ED1 6C656E616D652E6D6F-
  1872 00000EDA 640A0D00           
  1873 00000EDE 30382F31302F323031-     		db	'08/10/2017',0
  1873 00000EE7 3700               
  1874                                  
  1875                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1876                                  
  1877 00000EE9 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1877 00000EF2 506C61796572207630-
  1877 00000EFB 2E3162206279204361-
  1877 00000F04 726C6F732048617361-
  1877 00000F0D 6E2E204A756C792031-
  1877 00000F16 3939332E           
  1878 00000F1A 0A0D00                  		db	10,13,0
  1879 00000F1D 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1879 00000F26 64696E67204D6F6475-
  1879 00000F2F 6C652066696C652E0A-
  1879 00000F38 0D00               
  1880                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1881                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1882                                  ;PortText:	db	'x0h, IRQ '
  1883                                  ;IrqText:	db	'x.',10,13,0
  1884                                  
  1885                                  trdos386_err_msg:
  1886 00000F3A 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1886 00000F43 2053797374656D2063-
  1886 00000F4C 616C6C206572726F72-
  1886 00000F55 20210A0D00         
  1887                                  
  1888                                  PlayMsg:
  1889 00000F5A 0D0A                    		db	0Dh, 0Ah
  1890 00000F5C 506C6179696E67206D-     		db	"Playing music... "
  1890 00000F65 757369632E2E2E20   
  1891 00000F6D 00                      		db	0
  1892                                  OkMsg:
  1893 00000F6E 4F4B2E                  		db	"OK."
  1894                                  NextLine:
  1895 00000F71 0D0A00                  		db	0Dh, 0Ah, 0
  1896                                  
  1897                                  ; 04/10/2017
  1898 00000F74 0A                      pattern_shift:	db 10
  1899 00000F75 0400                    numtracks:	dw 4
  1900                                  
  1901                                  ;=============================================================================
  1902                                  ;        	uninitialized data
  1903                                  ;=============================================================================
  1904                                  
  1905                                  bss_start:
  1906                                  
  1907                                  ABSOLUTE bss_start
  1908                                  
  1909 00000F77 <res 00000001>          alignb 4
  1910                                  
  1911                                  ; 02/10/2017
  1912 00000F78 <res 00000004>          bar_start:	resd	1
  1913 00000F7C <res 00000004>          bar_stop:	resd	1
  1914                                  ; 06/10/2017
  1915 00000F80 <res 00000004>          prev_max:	resd	1
  1916                                  
  1917 00000F84 <res 00000004>          dev_vendor:	resd 1
  1918 00000F88 <res 00000004>          bus_dev_fn:	resd 1
  1919 00000F8C <res 00000004>          stats_cmd:	resd 1
  1920 00000F90 <res 00000002>          ac97_io_base:	resw 1
  1921 00000F92 <res 00000001>          ac97_int_ln_reg: resb 1
  1922 00000F93 <res 00000001>          srb:		resb 1
  1923                                  
  1924                                  ; MODLOAD.ASM
  1925 00000F94 <res 00000004>          FileHandle:	resd 1
  1926 00000F98 <res 0000043C>          Header:		resb ModHeader.size
  1927                                  
  1928                                  ; MODPLAY.ASM
  1929                                  ;MixSpeed:	    resw 1
  1930                                  
  1931                                  ModInfo:
  1932 000013D4 <res 00000001>          ModInfo.OrderLen:   resb 1
  1933 000013D5 <res 00000001>          ModInfo.ReStart:    resb 1
  1934 000013D6 <res 00000080>          ModInfo.Order:	    resb 128
  1935 00001456 <res 00000004>          ModInfo.Patterns:   resd 1
  1936                                  
  1937 0000145A <res 0000003E>          ModInfo.SampOfs:    resw 31
  1938 00001498 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1939 000014D6 <res 0000003E>          ModInfo.SampLen:    resw 31
  1940 00001514 <res 0000003E>          ModInfo.SampRep:    resw 31
  1941 00001552 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1942 00001590 <res 0000003E>          ModInfo.SampVol:    resw 31
  1943                                  
  1944                                  ; MODPLAY.ASM
  1945                                  PitchTable:	;resw 857
  1946 000015CE <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  1947 00003090 <res 00004100>          VolTable:	resb 16640
  1948 00007190 <res 00001000>          MixBuffer       resb MixBufSize
  1949                                  
  1950                                  ; MODPLAY.ASM
  1951 00008190 <res 00000001>          OrderPos:	resb 1
  1952 00008191 <res 00000001>          Tempo:		resb 1
  1953 00008192 <res 00000001>          TempoWait:	resb 1
  1954 00008193 <res 00000001>          Bpm:		resb 1
  1955 00008194 <res 00000001>          Row:		resb 1
  1956 00008195 <res 00000001>          BreakRow:	resb 1
  1957 00008196 <res 00000002>          BpmSamples:	resw 1
  1958 00008198 <res 00000004>          BufPtr:		resd 1
  1959 0000819C <res 00000002>          BufLen:		resw 1
  1960 0000819E <res 00000004>          BufRep:		resd 1
  1961 000081A2 <res 00000004>          Note:		resd 1
  1962                                  ;Tracks:	resb TrackInfo.size*NumTracks
  1963                                  
  1964                                  ; 06/10/2017
  1965 000081A6 <res 00000130>          Tracks:		resb TrackInfo.size*8
  1966                                  
  1967                                  mod_file_name:
  1968 000082D6 <res 00000050>          		resb 80
  1969                                  
  1970 00008326 <res 00000CDA>          alignb 4096
  1971                                  
  1972                                  Audio_Buffer:
  1973 00009000 <res 00010000>          		resb 2*32768
  1974 00019000 <res 00007000>          alignb 65536
  1975                                  
  1976 00020000 <res 00020000>          DMA_Buffer:	resb 2*65536
  1977                                  
  1978                                  file_buffer:
  1979 00040000 <res 00060000>          		resb 65536*6 ; 06/10/2017
  1980                                  EOF:
