     1                                  ; ****************************************************************************
     2                                  ; tmodply2.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TMODPLY2.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 27/10/2017
     7                                  ;
     8                                  ; [ Last Modification: 04/06/2024 ]  !!! STEREO MOD PLAYING !!!
     9                                  ;
    10                                  ; Derived from 'tmodplay.s' (TMODPLAY.PRG, SB16) source code by Erdogan Tan
    11                                  ; (27/10/2017). ((Stereo mod playing with TRDOS 386 audio system calls...))
    12                                  ;
    13                                  ; <tmodplay.s> note:
    14                                  ;
    15                                  ; For 640x480x16 display, 'TNYPL211' source code ('EX1A.ASM' and 'EX1B.ASM'
    16                                  ; by Carlos Hasan, 1994) is modified in order to use previous ('modplay7.s')
    17                                  ; scope method as stereo. (Track/channel scope method -in TNYPL211 files- 
    18                                  ; is/was not applied because TRDOS 386 adaption of the tiny mod player uses 
    19                                  ; dma buffer for immediate -synchronized- displaying of sound waves.
    20                                  ; So, stereo wave display -two waves, two scopes- is normally applicable.)
    21                                  ;
    22                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    23                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    24                                  ;
    25                                  ; Stereophonic mod playing code prototype: 
    26                                  ;		'modplay6.s' (AC97) by Erdogan Tan (20/10/2017)
    27                                  ;
    28                                  ; Modified by using the source code of 'tinyply3.s' ('TINYPLY3.PRG') 
    29                                  ; by Erdogan Tan (07/10/2017)
    30                                  ;
    31                                  ; Modified from 'playwav3.s' (13/06/2017)
    32                                  ;
    33                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    34                                  ;			                     (23/06/2017)
    35                                  ;
    36                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    37                                  ;				      (04/03/2017) 
    38                                  ; Assembler: NASM 2.11
    39                                  ; ----------------------------------------------------------------------------
    40                                  ;	   nasm  tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG	
    41                                  ; ****************************************************************************
    42                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    43                                  ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    44                                  
    45                                  ; 14/07/2020
    46                                  ; 31/12/2017
    47                                  ; TRDOS 386 (v2.0) system calls
    48                                  _ver 	equ 0
    49                                  _exit 	equ 1
    50                                  _fork 	equ 2
    51                                  _read 	equ 3
    52                                  _write	equ 4
    53                                  _open	equ 5
    54                                  _close 	equ 6
    55                                  _wait 	equ 7
    56                                  _create	equ 8
    57                                  _rename	equ 9
    58                                  _delete	equ 10
    59                                  _exec	equ 11
    60                                  _chdir	equ 12
    61                                  _time 	equ 13
    62                                  _mkdir 	equ 14
    63                                  _chmod	equ 15
    64                                  _rmdir	equ 16
    65                                  _break	equ 17
    66                                  _drive	equ 18
    67                                  _seek	equ 19
    68                                  _tell 	equ 20
    69                                  _memory	equ 21
    70                                  _prompt	equ 22
    71                                  _path	equ 23
    72                                  _env	equ 24
    73                                  _stime	equ 25
    74                                  _quit	equ 26
    75                                  _intr	equ 27
    76                                  _dir	equ 28
    77                                  _emt 	equ 29
    78                                  _ldrvt 	equ 30
    79                                  _video 	equ 31
    80                                  _audio	equ 32
    81                                  _timer	equ 33
    82                                  _sleep	equ 34
    83                                  _msg    equ 35
    84                                  _geterr	equ 36
    85                                  _fpstat	equ 37
    86                                  _pri	equ 38
    87                                  _rele	equ 39
    88                                  _fff	equ 40
    89                                  _fnf	equ 41
    90                                  _alloc	equ 42
    91                                  _dalloc equ 43
    92                                  _calbac equ 44
    93                                  _dma	equ 45		
    94                                  
    95                                  %macro sys 1-4
    96                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    97                                      ; 03/09/2015	
    98                                      ; 13/04/2015
    99                                      ; Retro UNIX 386 v1 system call.	
   100                                      %if %0 >= 2   
   101                                          mov ebx, %2
   102                                          %if %0 >= 3    
   103                                              mov ecx, %3
   104                                              %if %0 = 4
   105                                                 mov edx, %4   
   106                                              %endif
   107                                          %endif
   108                                      %endif
   109                                      mov eax, %1
   110                                      ;int 30h
   111                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
   112                                  %endmacro
   113                                  
   114                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   115                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   116                                  
   117                                  ; 19/06/2017
   118                                  BUFFERSIZE equ 32768 ; 04/12/2023 - modification for kernel buffer test
   119                                  ; 27/11/2023
   120                                  ;BUFFERSIZE equ 65536
   121                                  
   122                                  ; ----------------------------------------------------------------------------
   123                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   124                                  ;	July 14th, 1993.
   125                                  
   126                                  ;=============================================================================
   127                                  ;  
   128                                  ;=============================================================================
   129                                  
   130                                  [BITS 32]
   131                                  [org 0]
   132                                  
   133                                  Start:
   134                                  	; 27/11/2023
   135                                  	; clear bss
   136 00000000 B9[03000900]            	mov	ecx, EOF+3
   137 00000005 BF[AF520000]            	mov	edi, bss_start
   138 0000000A 29F9                    	sub	ecx, edi
   139 0000000C C1E902                  	shr	ecx, 2
   140 0000000F 31C0                    	xor	eax, eax
   141 00000011 F3AB                    	rep	stosd
   142                                  
   143                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   144 00000013 E831020000              	call    DetectICH
   145 00000018 731B                    	jnc     short GetFileName
   146                                  
   147                                  _dev_not_ready:
   148                                  ; couldn't find the audio device!
   149                                  	sys	_msg, noDevMsg, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000001A BB[56020000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000001F B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000024 BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000029 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 0000002E CD40                <1>  int 40h
   150 00000030 E9F3010000                      jmp     Exit
   151                                  
   152                                  GetFileName:
   153                                  	;cmp	ah, 1 ; SB16 Sound card
   154                                  	;jne	_dev_not_ready	
   155                                  	  
   156 00000035 89E6                    	mov	esi, esp
   157 00000037 AD                      	lodsd
   158 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   159                                  		; (program file name & mod file name)
   160 0000003B 0F82F0010000            	jb	pmsg_usage ; nothing to do
   161                                  
   162 00000041 AD                      	lodsd ; program file name address 
   163 00000042 AD                      	lodsd ; mod file name address (file to be read)
   164 00000043 89C6                    	mov	esi, eax
   165 00000045 BF[20E00000]            	mov	edi, mod_file_name
   166                                  ScanName:       
   167 0000004A AC                      	lodsb
   168 0000004B 84C0                    	test	al, al
   169 0000004D 0F84DE010000            	je	pmsg_usage
   170 00000053 3C20                    	cmp	al, 20h
   171 00000055 74F3                    	je	short ScanName	; scan start of name.
   172 00000057 AA                      	stosb
   173 00000058 B4FF                    	mov	ah, 0FFh
   174                                  a_0:	
   175 0000005A FEC4                    	inc	ah
   176                                  a_1:
   177 0000005C AC                      	lodsb
   178 0000005D AA                      	stosb
   179 0000005E 3C2E                    	cmp	al, '.'
   180 00000060 74F8                    	je	short a_0	
   181 00000062 20C0                    	and	al, al
   182 00000064 75F6                    	jnz	short a_1
   183                                  
   184 00000066 08E4                    	or	ah, ah		 ; if period NOT found,
   185 00000068 750B                    	jnz	short PrintPMesg ; then add a .MOD extension.
   186                                  SetExt:
   187 0000006A 4F                      	dec	edi
   188 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   189 00000071 C6470400                	mov	byte [edi+4], 0
   190                                  PrintPMesg:      
   191                                  	; Prints the Credits Text.
   192                                  	sys	_msg, Credits, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000075 BB[8E510000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000007A B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000007F BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000084 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000089 CD40                <1>  int 40h
   193                                  _1:
   194                                  	; 19/06/2017
   195                                  	; Allocate Audio Buffer (for user)
   196                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000008B BB00020000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000090 B900800000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000095 BA[00F00000]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000009A B820000000          <1>  mov eax, %1
   110                              <1> 
   111 0000009F CD40                <1>  int 40h
   197 000000A1 0F8206010000            	jc	error_exit
   198                                  _2:
   199                                  	;; Initialize Audio Device (bl = 1 -> Interrupt method)
   200                                  	;sys	_audio, 0301h, 0, sb16_int_handler 
   201                                  	;jc	error_exit
   202                                  	
   203                                  	; 20/10/2017
   204                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   205                                  	sys	_audio, 0300h, 1, srb 
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000A7 BB00030000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000000AC B901000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000000B1 BA[D1520000]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000B6 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000000BB CD40                <1>  int 40h
   206 000000BD 0F82EA000000            	jc	error_exit
   207                                  
   208                                  LoadMod:  
   209 000000C3 BF[20E00000]            	mov	edi, mod_file_name
   210 000000C8 E86B020000              	call    LoadModule		; Load the MODule...
   211                                  	; 08/10/2017
   212 000000CD 731B                    	jnc	short _3		; any error loading?
   213                                  
   214                                  	; yes, print error and Exit.
   215                                  
   216                                  	sys	_msg, ErrorMesg, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000CF BB[C2510000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000000D4 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000000D9 BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000DE B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000000E3 CD40                <1>  int 40h
   217 000000E5 E93E010000              	jmp     Exit
   218                                  _3:
   219                                  	; 10/06/2017
   220                                  	sys	_audio, 0E00h ; get audio controller info
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000EA BB000E0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000EF B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000000F4 CD40                <1>  int 40h
   221 000000F6 0F82B1000000            	jc	error_exit
   222                                  
   223                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   224                                  	;jne	_dev_not_ready	
   225                                  
   226                                  	; EAX = IRQ Number in AL
   227                                  	;	Audio Device Number in AH 
   228                                  	; EBX = DEV/VENDOR ID
   229                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   230                                  	; ECX = BUS/DEV/FN 
   231                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   232                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   233                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   234                                  	;      (Low word, DX = NAMBAR address)
   235                                  
   236 000000FC A2[D0520000]            	mov	[ac97_int_ln_reg], al
   237 00000101 891D[C0520000]          	mov	[dev_vendor], ebx
   238 00000107 890D[C4520000]          	mov	[bus_dev_fn], ecx
   239 0000010D 668915[CC520000]        	mov	[ac97_NamBar], dx
   240                                  	;mov	[ac97_NamBar], dx
   241                                  	;shr	dx, 16
   242                                  	;mov	[ac97_NabmBar], dx
   243 00000114 8915[CC520000]          	mov	[ac97_NamBar], edx	
   244                                    
   245 0000011A E8C80A0000              	call	write_audio_dev_info 
   246                                  
   247                                  PlayNow: 
   248 0000011F E8E3090000              	call    StartPlaying
   249                                  
   250                                  	; load 32768 bytes into audio buffer
   251 00000124 BF[00F00000]            	mov	edi, Audio_Buffer
   252                                  	; 19/10/2017
   253                                  	;mov	ebx, BUFFERSIZE
   254 00000129 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   255 0000012E E883080000              	call	GetSamples
   256 00000133 7278                    	jc	error_exit
   257                                  
   258                                  	; 27/11/2023
   259                                  	; bh = 16 : update (current, first) dma half buffer
   260                                  	; bl = 0  : then switch to the next (second) half buffer
   261                                  	sys	_audio, 1000h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000135 BB00100000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000013A B820000000          <1>  mov eax, %1
   110                              <1> 
   111 0000013F CD40                <1>  int 40h
   262                                  
   263                                  	; 27/11/2023
   264                                  	; load 32768 bytes into audio buffer
   265 00000141 BF[00F00000]            	mov	edi, Audio_Buffer
   266                                  	; 19/10/2017
   267                                  	;mov	ebx, BUFFERSIZE
   268 00000146 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   269 0000014B E866080000              	call	GetSamples
   270 00000150 725B                    	jc	error_exit
   271                                  
   272                                  ;	;mov	ecx, 128	; Make a lookup table
   273                                  ;	mov	cl, 128
   274                                  ;	xor     ebx, ebx	; for fastest pixel
   275                                  ;	mov     edx, 320*(100-64)	; addressing.
   276                                  ;MakeOfs:        
   277                                  ;	mov     [RowOfs+ebx], dx
   278                                  ;	mov     [RowOfs+ebx+2], dx
   279                                  ;	add     dx, 320
   280                                  ;	add     ebx, 4
   281                                  ;	loop    MakeOfs
   282                                  
   283                                  	; 27/10/2017
   284 00000152 66B90001                	mov	cx, 256
   285 00000156 31DB                    	xor	ebx, ebx
   286 00000158 BF[20D60000]            	mov	edi, RowOfs
   287                                  MakeOfs:
   288                                  	; 29/10/2017
   289                                  	;mov	ax, 128
   290                                  	;mul	bx
   291                                  	;mov	al, ah
   292                                  	;mov	ah, 80
   293                                  	;mul	ah
   294 0000015D 89D8                    	mov	eax, ebx
   295 0000015F 66C1E007                	shl	ax, 7 ; * 128
   296 00000163 B050                    	mov	al, 80
   297 00000165 F6E4                    	mul	ah
   298 00000167 66AB                    	stosw
   299 00000169 43                      	inc	ebx
   300 0000016A E2F1                    	loop	MakeOfs
   301                                  	
   302                                  	; 04/06/2024
   303                                  	; 23/06/2017
   304                                  	; Map DMA buffer to user's memory space
   305                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000016C BB000D0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000171 B900000100          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000176 BA[00000200]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000017B B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000180 CD40                <1>  int 40h
   306                                  	;;jc	error_exit
   307                                  	; 27/11/2023
   308                                  	;sys	_audio, 0D00h, 131072, DMA_Buffer
   309                                  	
   310                                  	; 24/06/2017
   311                                  	; Set Master Volume Level (BL=0 or 80h)
   312                                  	; 	 	for next playing (BL>=80h)
   313                                  	sys	_audio, 0B80h, 1D1Dh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000182 BB800B0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000187 B91D1D0000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000018C B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000191 CD40                <1>  int 40h
   314                                  
   315                                  	; 20/10/2017
   316 00000193 C605[71E00000]1D        	mov	byte [volume_level], 1Dh
   317                                  
   318                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   319                                  	
   320                                  	; 27/11/2023
   321                                  	; Start	to play
   322                                  	;mov	al, [bps]
   323                                  	;shr	al, 4 ; 8 -> 0, 16 -> 1
   324                                  	;shl	al, 1 ; 16 -> 2, 8 -> 0
   325                                  	;mov	bl, [stmo]
   326                                  	;dec	bl
   327                                  	;or	bl, al
   328                                  	;mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   329                                  	;mov	bh, 4 ; start to play	
   330                                  	;sys	_audio
   331                                      
   332                                  	;; SETUP SIGNAL RESPONSE BYTE
   333                                  	;; 06/03/2017
   334                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   335                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   336                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   337                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   338                                  	;sys	_calbac
   339                                  	;jc	short error_exit
   340                                  
   341                                  	; DIRECT VGA MEMORY ACCESS
   342                                  	; bl = 0, bh = 5
   343                                  	; Direct access/map to VGA memory (0A0000h)
   344                                  
   345                                  	sys	_video, 0500h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000019A BB00050000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000019F B81F000000          <1>  mov eax, %1
   110                              <1> 
   111 000001A4 CD40                <1>  int 40h
   346 000001A6 3D00000A00              	cmp	eax, 0A0000h
   347 000001AB 7418                    	je	short _a3
   348                                  error_exit:
   349                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001AD BB[DF510000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000001B2 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000001B7 BA0E000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001BC B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000001C1 CD40                <1>  int 40h
   350 000001C3 EB63                    	jmp	short Exit
   351                                  
   352                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   353                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   354                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   355                                  ;       second, or the module will sound "looped".
   356                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   357                                  ;       the polling is called from my routine, and then the irq 0 must be
   358                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   359                                  ;       samples played by the Sound Blaster. Note that some samples are
   360                                  ;       discarded in the next code, just for fun!
   361                                  
   362                                  _a3:
   363                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   364                                  	;int     31h
   365                                  
   366                                  	; 21/10/2017
   367                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   368                                  	;int	31h
   369                                  
   370                                  	; 22/10/2017
   371 000001C5 E8DD0B0000              	call	setgraphmode	; Set video mode to 640*480x16
   372                                  
   373                                  	; 22/10/2017
   374                                  	;call	loadlbm
   375                                  	;jc	short loadlbm_err
   376                                  
   377 000001CA BE[C80F0000]            	mov	esi, LOGO_ADDRESS
   378 000001CF E8BE0C0000              	call	putlbm
   379                                  	;jnc	short loadlbm_ok
   380 000001D4 731F                    	jnc	short _a4 ; 
   381                                  
   382                                  	;mov	byte [error_color], 0Eh ; Yellow
   383                                  
   384                                  loadlbm_err:
   385                                  	; 21/10/2017
   386                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   387                                  	;int	31h
   388                                  	; 22/10/2017
   389 000001D6 E8E90B0000              	call	settextmode
   390                                  
   391                                  	sys	_msg, LOGO_ERROR_MSG, 255, [error_color]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001DB BB[9C0F0000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000001E0 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000001E5 8B15[F4010000]      <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001EB B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000001F0 CD40                <1>  int 40h
   392 000001F2 EB34                    	jmp	short Exit
   393                                  
   394                                  	; 21/10/2017
   395                                  error_color:
   396 000001F4 0C                      	db	0Ch  ; Light Red
   397                                  	
   398                                  loadlbm_ok: 
   399                                  	; 21/10/2017
   400                                  _a4:
   401                                  	; 27/11/2023
   402                                  	; Start	to play
   403 000001F5 A0[05520000]            	mov	al, [bps]
   404 000001FA C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   405 000001FD D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   406 000001FF 8A1D[04520000]          	mov	bl, [stmo]
   407 00000205 FECB                    	dec	bl
   408 00000207 08C3                    	or	bl, al
   409 00000209 668B0D[06520000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   410 00000210 B704                    	mov	bh, 4 ; start to play	
   411                                  	sys	_audio
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101                              <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000212 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000217 CD40                <1>  int 40h
   412                                  
   413                                  	; 24/06/2017
   414 00000219 E863000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   415                                  
   416                                  _s_exit:
   417 0000021E E893090000              	call	StopPlaying	; STOP!
   418                                  	
   419                                  	; 22/10/2017
   420                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   421                                  	;int	31h
   422 00000223 E89C0B0000              	call	settextmode
   423                                  Exit:           
   424                                  	;call	FreeModule	; Free MODule core.
   425                                  	
   426                                  	sys 	_exit	; Bye !
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101                              <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000228 B801000000          <1>  mov eax, %1
   110                              <1> 
   111 0000022D CD40                <1>  int 40h
   427                                  here:
   428 0000022F EBFE                    	jmp	short here
   429                                  
   430                                  pmsg_usage:
   431                                  	sys	_msg, msg_usage, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000231 BB[01510000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000236 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000023B BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000240 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000245 CD40                <1>  int 40h
   432 00000247 EBDF                    	jmp	short Exit
   433                                  
   434                                  DetectICH:
   435                                  	; 24/06/2017
   436                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   437                                          sys	_audio, 0102h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000249 BB02010000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000024E B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000253 CD40                <1>  int 40h
   438 00000255 C3                      	retn
   439                                  
   440                                  noDevMsg:
   441 00000256 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   441 0000025F 61626C6520746F2066-
   441 00000268 696E64204143393720-
   441 00000271 617564696F20646576-
   441 0000027A 696365210D0A00     
   442                                  
   443                                  ;ac97_int_handler:
   444                                  ;	; 19/06/2017
   445                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   446                                  ;
   447                                  ;	sys	_rele ; return from callback service 
   448                                  ;	; we must not come here !
   449                                  ;	sys	_exit
   450                                  
   451                                  ;=============================================================================
   452                                  ;      
   453                                  ;=============================================================================
   454                                  
   455                                  PlayMod:
   456                                  	; 27/11/2023
   457                                  	; 27/10/2017
   458                                  	; 19/10/2017
   459                                  	; 23/06/2017   
   460                                  	; 21/06/2017
   461                                  	; 19/06/2017
   462                                  
   463                                  	; 05/03/2017 (TRDOS 386)
   464                                  	; 14/02/2017
   465                                  	; 13/02/2017
   466                                  	; 08/12/2016
   467                                  	; 28/11/2016
   468                                  
   469                                  	; 27/11/2023
   470                                       	;jmp	short modp_gs
   471                                  p_loop:
   472 00000281 803D[D1520000]00        	cmp	byte [srb], 0
   473 00000288 761D                    	jna	short q_loop
   474 0000028A C605[D1520000]00        	mov	byte [srb], 0
   475                                  modp_gs:
   476 00000291 BF[00F00000]            	mov	edi, Audio_Buffer
   477                                  	; 19/10/2017
   478                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   479 00000296 BB00200000              	mov	ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer
   480 0000029B E816070000              	call	GetSamples
   481                                  	;jc	error_exit
   482                                  	; 27/11/2023
   483 000002A0 73DF                    	jnc	short p_loop
   484 000002A2 E906FFFFFF              	jmp	error_exit
   485                                  q_loop:
   486 000002A7 B401                    	mov     ah, 1		; any key pressed?
   487 000002A9 CD32                    	int     32h		; no, Loop.
   488 000002AB 745C                    	jz	short r_loop
   489                                  
   490 000002AD B400                    	mov     ah, 0		; flush key buffer...
   491 000002AF CD32                    	int     32h
   492                                  
   493                                  	; 19/10/2017 (modplay6.s)
   494 000002B1 3C20                    	cmp	al, 20h
   495 000002B3 740E                    	je	short change_pan
   496                                  	; 09/10/2017 (playmod5.s)
   497 000002B5 3C2B                    	cmp	al, '+' ; increase sound volume
   498 000002B7 741D                    	je	short inc_volume_level
   499 000002B9 3C2D                    	cmp	al, '-'
   500 000002BB 743C                    	je	short dec_volume_level
   501                                  
   502                                  	; 19/10/2017 (modplay6.s)
   503 000002BD 24DF                    	and	al, 0DFh
   504 000002BF 3C50                    	cmp	al, 'P'
   505 000002C1 7545                    	jne	short q_return
   506                                  
   507                                  change_pan:
   508                                  	; 19/10/2017 (modplay6.s)
   509 000002C3 8A0D[70E00000]          	mov	cl, [pan_shift]
   510 000002C9 FEC1                    	inc	cl
   511 000002CB 80E103                  	and	cl, 3
   512 000002CE 880D[70E00000]          	mov	[pan_shift], cl
   513 000002D4 EB33                    	jmp	short r_loop
   514                                  
   515                                  	; 09/10/2017 (playmod5.s)
   516                                  	; 24/06/2017 (wavplay2.s)
   517                                  inc_volume_level:
   518 000002D6 8A0D[71E00000]          	mov	cl, [volume_level]
   519 000002DC 80F91F                  	cmp	cl, 1Fh ; 31
   520 000002DF 7328                    	jnb	short r_loop
   521 000002E1 FEC1                    	inc	cl
   522                                  change_volume_level:
   523 000002E3 880D[71E00000]          	mov	[volume_level], cl
   524 000002E9 88CD                    	mov	ch, cl
   525                                  	; Set Master Volume Level
   526                                  	sys	_audio, 0B00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000002EB BB000B0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000002F0 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000002F5 CD40                <1>  int 40h
   527 000002F7 EB10                    	jmp	short r_loop
   528                                  dec_volume_level:
   529 000002F9 8A0D[71E00000]          	mov	cl, [volume_level]
   530 000002FF 80F901                  	cmp	cl, 1 ; 1
   531 00000302 7605                    	jna	short r_loop
   532 00000304 FEC9                    	dec	cl
   533 00000306 EBDB                    	jmp	short change_volume_level
   534                                  
   535                                  q_return:
   536 00000308 C3                      	retn
   537                                  r_loop:
   538                                  	; 27/10/2017
   539                                  	; Get Current DMA buffer Pointer 
   540                                  	; 23/06/2017 ('modplay6.s')
   541                                  	; bh = 15, get current pointer (DMA buffer offset)
   542                                  	; bl = 0, for PCM OUT
   543                                  	; ecx = 0
   544                                  	;
   545                                  	sys	_audio, 0F00h, 0
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000309 BB000F0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000030E B900000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000313 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000318 CD40                <1>  int 40h
   546                                  
   547                                  	; 28/10/2017
   548 0000031A 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   549                                  	; 23/06/2017
   550 0000031C BE[00000200]            	mov     esi, DMA_Buffer
   551 00000321 01C6                    	add     esi, eax	; add offset value
   552                                  	; 04/06/2024
   553                                  	; 24/06/2017
   554 00000323 B9[00FC0200]            	mov	ecx, DMA_Buffer + (65536 - (256*4))
   555                                  	; 27/11/2023
   556                                  	;mov	ecx, DMA_Buffer + (131072 - (256*4))
   557 00000328 39CE                    	cmp	esi, ecx 
   558 0000032A 7602                    	jna	short _4
   559 0000032C 89CE                    	mov	esi, ecx
   560                                  _4:
   561                                  	; 23/10/2017 ('tmodplay.s')
   562 0000032E E8980A0000              	call	drawscopes
   563                                  
   564 00000333 E949FFFFFF              	jmp	p_loop
   565                                  
   566                                  ;=============================================================================
   567                                  ;               MODLOAD.ASM
   568                                  ;=============================================================================
   569                                  
   570                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   571                                  ;	July 10th, 1993.
   572                                  
   573                                  ; STRUCTURES
   574                                  
   575                                  struc ModSample
   576 00000000 <res 16h>               .msName:	resb 22
   577 00000016 ????                    .msLength:	resw 1
   578 00000018 ??                      .msFinetune:	resb 1
   579 00000019 ??                      .msVolume:	resb 1
   580 0000001A ????                    .msRepeat:	resw 1
   581 0000001C ????                    .msRepLen:	resw 1
   582                                  .size:		; 30 bytes
   583                                  endstruc
   584                                  
   585                                  struc ModHeader
   586 00000000 <res 14h>               .mhName:	resb 20
   587 00000014 <res 3A2h>              .mhSamples:	resb ModSample.size*31
   588 000003B6 ??                      .mhOrderLen:	resb 1
   589 000003B7 ??                      .mhReStart:	resb 1
   590 000003B8 <res 80h>               .mhOrder:	resb 128
   591 00000438 ????????                .mhSign:	resw 2
   592                                  .size:		; 1084 bytes
   593                                  endstruc
   594                                  
   595                                  struc ModInfoRec
   596 00000000 ??                      .OrderLen:	resb 1
   597 00000001 ??                      .ReStart:	resb 1
   598 00000002 <res 80h>               .Order:		resb 128
   599 00000082 ????????                .Patterns:	resd 1
   600 00000086 <res 3Eh>               .SampOfs:	resw 31
   601 000000C4 <res 3Eh>               .SampSeg:	resw 31
   602 00000102 <res 3Eh>               .SampLen:	resw 31
   603 00000140 <res 3Eh>               .SampRep:	resw 31
   604 0000017E <res 3Eh>               .SampRepLen:	resw 31
   605 000001BC <res 3Eh>               .SampVol:	resw 31
   606                                  .size:		; 506 bytes	
   607                                  endstruc
   608                                  
   609                                  ; CODE
   610                                  
   611                                  ; modplay5.s
   612                                  ; 07/10/2017
   613                                  ; tinyply3.s
   614                                  ; 06/10/2017
   615                                  ; 04/10/2017
   616                                  ; /* MOD FileFormat */
   617                                  
   618                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   619                                  ID_FLT4 equ 34544C46h ; "FLT4"
   620                                  ID_8CHN equ 4E484338h ; "8CHN"
   621                                  ID_FLT8 equ 34544C46h ; "FLT8"
   622                                  
   623                                  ; CODE
   624                                  
   625                                  LoadModule:
   626                                  	; edi = file name address
   627                                  
   628 00000338 60                      	pushad
   629                                  
   630 00000339 E871010000              	call    ClearModInfo
   631                                  OpenFile:       
   632                                  	; ebx = ASCIIZ file name address
   633                                  	; ecx = open mode (0 = open for read)	
   634                                  	sys	_open, edi, 0 ; open for reading
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000033E 89FB                <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000340 B900000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000345 B805000000          <1>  mov eax, %1
   110                              <1> 
   111 0000034A CD40                <1>  int 40h
   635 0000034C 0F825B010000            	jc	Failed
   636 00000352 A3[D2520000]            	mov     [FileHandle], eax
   637                                  ReadHeader:
   638                                  	; ebx = File handle
   639                                  	; ecx = Buffer address
   640                                  	; edx = Byte count
   641                                  	sys	_read, [FileHandle], Header, ModHeader.size
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000357 8B1D[D2520000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000035D B9[D6520000]        <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000362 BA3C040000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000367 B803000000          <1>  mov eax, %1
   110                              <1> 
   111 0000036C CD40                <1>  int 40h
   642 0000036E 0F822A010000            	jc      CloseFile
   643                                  CheckMK:  
   644                                  	; 04/10/2017
   645 00000374 A1[0E570000]            	mov	eax, [Header+ModHeader.mhSign]
   646                                        
   647 00000379 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   648                                  	;je	short Is4chnMod
   649 0000037E 742B                    	je	short IsModFile
   650                                  CheckFLT4:
   651 00000380 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   652                                  	;je	short Is4chnMod
   653 00000385 7424                    	je	short IsModFile
   654                                  Check8CHN:
   655 00000387 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   656 0000038C 740D                    	je	short Is8chnMod
   657                                  CheckFLT8:
   658 0000038E 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   659                                  	; 06/10/2017
   660 00000393 7406                    	je	short Is8chnMod
   661 00000395 F9                      	stc
   662 00000396 E903010000              	jmp	CloseFile
   663                                  Is8chnMod:
   664 0000039B C605[00520000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   665 000003A2 C605[FF510000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   666 000003A9 EB00                    	jmp	short IsModFile
   667                                  ;Is4chnMod:
   668                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   669                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   670                                  
   671                                  IsModFile:
   672 000003AB A0[8C560000]            	mov     al, [Header+ModHeader.mhOrderLen]
   673 000003B0 A2[12570000]            	mov     [ModInfo.OrderLen], al
   674                                  
   675 000003B5 A0[8D560000]            	mov     al, [Header+ModHeader.mhReStart]
   676 000003BA 3A05[8C560000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   677 000003C0 7202                    	jb      short SetReStart
   678 000003C2 B07F                    	mov     al, 7Fh
   679                                  SetReStart:
   680 000003C4 A2[13570000]            	mov     [ModInfo.ReStart], al
   681                                  
   682                                  	;mov	ecx, 128
   683 000003C9 66B98000                	mov	cx, 128
   684 000003CD 31D2                    	xor     edx, edx
   685 000003CF 31DB                    	xor     ebx, ebx
   686                                  CopyOrder:
   687 000003D1 8AB3[8E560000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   688 000003D7 88B3[14570000]          	mov     [ModInfo.Order+ebx], dh
   689 000003DD 38D6                    	cmp     dh, dl
   690 000003DF 7202                    	jb      short NextOrder
   691 000003E1 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   692                                  NextOrder:
   693 000003E3 43                      	inc     ebx
   694 000003E4 E2EB                    	loop    CopyOrder
   695                                  AllocPatterns:  
   696 000003E6 81E2FF000000            	and	edx, 0FFh
   697                                  	; 04/10/2017
   698                                  	;inx	dx  ; 12/03/2017
   699 000003EC FEC2                    	inc	dl
   700                                  	; dl = number of patterns (04/07/2017)
   701 000003EE 8A0D[FF510000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   702 000003F4 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   703                                  		     	     ; *2048 ; (byte count of patterns *64*8*4)
   704                                  	;
   705 000003F6 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   706                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   707 000003F8 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   708                                  	;
   709 000003FD 890D[94570000]          	mov	[ModInfo.Patterns], ecx
   710                                  	;
   711 00000403 01CD                    	add	ebp, ecx ; next offset for samples
   712                                  ReadPatterns:  
   713                                  	;mov	ebx, [FileHandle] 
   714                                  	; ebx = File handle
   715                                  	; ecx = Buffer address
   716                                  	; edx = Byte count
   717                                  	sys	_read, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000405 8B1D[D2520000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000040B B803000000          <1>  mov eax, %1
   110                              <1> 
   111 00000410 CD40                <1>  int 40h
   718 00000412 0F8286000000            	jc      CloseFile
   719                                  
   720                                  	; patterns have been loaded here... (04/07/2017)
   721                                  
   722 00000418 BE[EA520000]            	mov	esi, Header+ModHeader.mhSamples
   723 0000041D 31FF                    	xor     edi, edi
   724                                  CopySamples:
   725 0000041F 668B4616                	mov     ax, [esi+ModSample.msLength]
   726 00000423 86C4                    	xchg    al, ah
   727                                  	;shl	ax, 1
   728                                  	; 27/11/2023
   729 00000425 D1E0                    	shl	eax, 1
   730 00000427 668987[14580000]        	mov     [ModInfo.SampLen+edi], ax
   731                                  	; 27/11/2023
   732 0000042E 31C0                    	xor	eax, eax
   733 00000430 8A4619                  	mov     al, [esi+ModSample.msVolume]
   734                                  	;xor	ah, ah
   735 00000433 668987[CE580000]        	mov     [ModInfo.SampVol+edi], ax
   736 0000043A 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   737 0000043E 86C4                    	xchg    al, ah
   738                                  	;shl	ax, 1
   739                                  	; 27/11/2023
   740 00000440 D1E0                    	shl	eax, 1
   741 00000442 668987[52580000]        	mov     [ModInfo.SampRep+edi], ax
   742 00000449 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   743 0000044D 86C4                    	xchg    al, ah
   744                                  	;shl	ax, 1
   745                                  	; 27/11/2023
   746 0000044F D1E0                    	shl	eax, 1
   747 00000451 668987[90580000]        	mov     [ModInfo.SampRepLen+edi], ax
   748 00000458 83C61E                  	add     esi, ModSample.size
   749                                  	;add	di, 2
   750                                  	; 27/11/2023
   751 0000045B 47                      	inc	edi
   752 0000045C 47                      	inc	edi
   753 0000045D 6683FF3E                	cmp     di, 2*31
   754 00000461 72BC                    	jb      short CopySamples
   755                                  
   756 00000463 31F6                    	xor     esi, esi
   757                                  AllocSamples:
   758 00000465 0FB796[14580000]        	movzx	edx, word [ModInfo.SampLen+esi]
   759                                  	; 07/10/2017
   760                                  	;shr	dx, 4 ; ***
   761 0000046C 21D2                    	and	edx, edx
   762 0000046E 7426                    	jz      short NextSample
   763                                  	;inc	dx  ; number of paragraphs ; ***
   764                                  	;shl	dx, 4 ; ***
   765 00000470 89E8                    	mov	eax, ebp
   766 00000472 668986[98570000]        	mov	[ModInfo.SampOfs+esi], ax
   767 00000479 C1E810                  	shr	eax, 16
   768 0000047C 668986[D6570000]        	mov	[ModInfo.SampSeg+esi], ax
   769 00000483 89E9                    	mov	ecx, ebp
   770 00000485 01D5                    	add	ebp, edx ; next offset for sample 
   771                                  ReadSample:
   772                                  	;mov	ebx, [FileHandle]
   773                                  	;movzx  edx, [ModInfo.SampLen+esi]
   774                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   775                                  
   776                                  	; ebx = File handle
   777                                  	; ecx = Buffer address
   778                                  	; edx = Byte count
   779                                  	sys	_read, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000487 8B1D[D2520000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000048D B803000000          <1>  mov eax, %1
   110                              <1> 
   111 00000492 CD40                <1>  int 40h
   780 00000494 7208                    	jc      short CloseFile
   781                                  
   782                                  NextSample:
   783                                  	;add	si, 2
   784                                  	; 27/11/2023
   785 00000496 46                      	inc	esi
   786 00000497 46                      	inc	esi
   787 00000498 6683FE3E                	cmp     si, 2*31
   788 0000049C 72C7                    	jb      short AllocSamples
   789                                  CloseFile:      
   790 0000049E 9C                      	pushf
   791                                  	sys	_close, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000049F 8B1D[D2520000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000004A5 B806000000          <1>  mov eax, %1
   110                              <1> 
   111 000004AA CD40                <1>  int 40h
   792 000004AC 9D                      	popf
   793                                  Failed:       
   794 000004AD 61                      	popad
   795 000004AE C3                      	retn
   796                                  
   797                                  FreeModule:
   798                                  	; Erdogan Tan (13/02/2017)
   799                                  	; nothing to do here for memory de-allocation
   800                                  ClearModInfo:
   801 000004AF 57                      	push	edi
   802 000004B0 BF[12570000]            	mov	edi, ModInfo
   803 000004B5 B9FA010000              	mov     ecx, ModInfoRec.size
   804                                  	;cld
   805 000004BA 30C0                    	xor     al, al
   806 000004BC F3AA                    	rep     stosb
   807 000004BE 5F                      	pop	edi
   808 000004BF C3                      	retn
   809                                  
   810                                  ;=============================================================================
   811                                  ;               MODPLAY.ASM
   812                                  ;=============================================================================
   813                                  
   814                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   815                                  ;	July 23th, 1993.
   816                                  
   817                                  ; EQUATES
   818                                  
   819                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   820                                  DefTempo        equ 6
   821                                  DefBpm          equ 125
   822                                  MidCRate        equ 8448
   823                                  MixBufSize	equ 4096
   824                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   825                                  
   826                                  ; STRUCTURES
   827                                  
   828                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   829 00000000 ????????                .Samples:	resd 1
   830                                  ;.Position:	resw 1
   831 00000004 ????????                .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   832 00000008 ????                    .Len:		resw 1
   833 0000000A ????                    .Repeat:	resw 1
   834 0000000C ????                    .RepLen:	resw 1
   835 0000000E ??                      .Volume: 	resb 1 ; Volume
   836 0000000F ??                      .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   837                                  ;.Error:	resb 1
   838                                  ;.Reserved:	resb 1 ; 01/10/2017
   839 00000010 ????                    .Period:	resw 1 ; Period
   840 00000012 ????                    .Pitch:		resw 1 
   841 00000014 ????                    .Effect:	resw 1 ; Effect
   842 00000016 ????                    .PortTo:	resw 1 ; Toneporta wanted period
   843 00000018 ??                      .PortParm:	resb 1 ; Toneporta speed
   844 00000019 ??                      .VibPos:	resb 1 ; Vibrato wave position 
   845 0000001A ??                      .VibParm:	resb 1 ; Vibrato depth/rate
   846 0000001B ??                      .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   847 0000001C ??                      .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   848                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   849 0000001D ??                      .Error:		resb 1 ; 01/10/2017
   850 0000001E ????????????            .Arp:		resw 3
   851 00000024 ????                    .ArpIndex:	resw 1
   852                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   853                                  endstruc
   854                                  
   855                                  ; CODE
   856                                  
   857                                  ;--------------------------------------------------------------------------
   858                                  ; updatechannel - update the track using the current effect
   859                                  ;--------------------------------------------------------------------------
   860                                  ; 
   861                                  ;--------------------------------------------------------------------------
   862                                  ; 	Track:  Process the next 	 in one track.
   863                                  ;  In:
   864                                  ;    ds:di -  Track info Address.
   865                                  ;--------------------------------------------------------------------------
   866                                  
   867                                  ; edi = Track info address
   868                                  
   869                                  updatechannel:
   870                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   871                                  
   872 000004C0 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   873                                  
   874                                  	;test   dx, dx
   875                                  	;je     short None
   876                                  	;cmp    dh, 00h
   877                                  	;je     short Arpeggio
   878                                  	;cmp    dh, 01h
   879                                  	;je     short PortUp
   880                                  	;cmp    dh, 02h
   881                                  	;je     short PortDown
   882                                  	;cmp    dh, 03h
   883                                  	;je     TonePort
   884                                  	;cmp    dh, 04h
   885                                  	;je     Vibrato
   886                                  	;cmp    dh, 05h
   887                                  	;je     PortSlide
   888                                  	;cmp    dh, 06h
   889                                  	;je     VibSlide
   890                                  	;cmp    dh, 0Ah
   891                                  	;je     VolSlide
   892                                  	;retn
   893                                  
   894 000004C4 0FB6C6                  	movzx	eax, dh
   895 000004C7 240F                    	and	al, 0Fh
   896 000004C9 FF2485[F84F0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   897                                  efxnull:
   898                                  None:           
   899 000004D0 C3                      	retn
   900                                  efxarpeggio2:
   901                                  	; 01/10/2017
   902 000004D1 84D2                    	test    dl, dl
   903 000004D3 74FB                    	jz      short efxnull
   904                                  Arpeggio:
   905 000004D5 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   906 000004D9 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   907 000004DE 66894712                	mov     [edi+TrackInfo.Pitch], ax
   908 000004E2 6683C302                	add     bx, 2
   909 000004E6 6683FB06                	cmp     bx, 6
   910 000004EA 7202                    	jb      short SetArpIndex
   911 000004EC 31DB                    	xor     ebx, ebx
   912                                  SetArpIndex:
   913 000004EE 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   914 000004F2 C3                      	retn
   915                                  efxportaup:
   916                                  PortUp:
   917 000004F3 30F6                    	xor     dh, dh
   918                                  	;mov	bx, [edi+TrackInfo.Period]
   919 000004F5 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   920 000004F9 6629D3                  	sub     bx, dx
   921                                  	;cmp	bx, 113
   922 000004FC 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   923 00000500 7D04                    	jge     short NotSmall
   924                                  	;mov	bx, 113
   925 00000502 66BB1C00                	mov	bx, 28 ; 01/10/2017
   926                                  NotSmall:
   927 00000506 66895F10                	mov     [edi+TrackInfo.Period], bx
   928 0000050A 6601DB                  	add     bx, bx
   929                                  	;mov	ax, [PitchTable+bx]
   930 0000050D 668B83[0C590000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   931 00000514 66894712                	mov     [edi+TrackInfo.Pitch], ax
   932 00000518 C3                      	retn
   933                                  efxportadown:
   934                                  PortDown:
   935 00000519 30F6                    	xor     dh, dh
   936                                  	;mov	bx, [edi+TrackInfo.Period]
   937 0000051B 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   938 0000051F 6601D3                  	add     bx, dx
   939 00000522 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   940                                  	;cmp	bx, 856
   941 00000527 7E04                    	jle     short NotBig
   942                                  	;mov	bx, 856
   943 00000529 66BB600D                	mov	bx, 3424 ; 01/10/2017
   944                                  NotBig:         
   945 0000052D 66895F10                	mov     [edi+TrackInfo.Period], bx
   946 00000531 6601DB                  	add     bx, bx
   947                                  	;mov	ax, [PitchTable+bx]
   948 00000534 668B83[0C590000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   949 0000053B 66894712                	mov     [edi+TrackInfo.Pitch], ax
   950 0000053F C3                      	retn
   951                                  efxtoneporta2:
   952                                  TonePort:
   953 00000540 30F6                    	xor     dh, dh
   954 00000542 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   955                                  	;mov	bx, [edi+TrackInfo.Period]
   956 00000546 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   957 0000054A 6639C3                  	cmp     bx, ax
   958 0000054D 7429                    	je      short NoPort
   959 0000054F 7F0D                    	jg      short PortToUp
   960                                  PortToDown:     
   961 00000551 6601D3                  	add     bx, dx
   962 00000554 6639C3                  	cmp     bx, ax
   963 00000557 7E0D                    	jle     short SetPort
   964                                  FixPort:        
   965 00000559 6689C3                  	mov     bx, ax
   966 0000055C EB08                    	jmp     short SetPort
   967                                  PortToUp:
   968 0000055E 6629D3                  	sub     bx, dx
   969 00000561 6639C3                  	cmp     bx, ax
   970 00000564 7CF3                    	jl      short FixPort
   971                                  SetPort:        
   972 00000566 66895F10                	mov     [edi+TrackInfo.Period], bx
   973 0000056A 6601DB                  	add     bx, bx
   974                                  	;mov	ax, [PitchTable+bx]
   975 0000056D 668B83[0C590000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   976 00000574 66894712                	mov     [edi+TrackInfo.Pitch], ax
   977                                  NoPort:         
   978 00000578 C3                      	retn
   979                                  efxvibrato2:
   980                                  	; 01/10/2017
   981                                  Vibrato:
   982 00000579 88D6                    	mov     dh, dl
   983                                  	;and	dl, 0Fh
   984                                  	;shr	dh, 4
   985                                  	;shl	dh, 2
   986 0000057B 6681E20FF0              	and     dx, 0F00Fh
   987 00000580 C0EE02                  	shr     dh, 2
   988                                  	;add	[edi+TrackInfo.VibPos], dh
   989                                  	;mov	dh, [edi+TrackInfo.VibPos]
   990                                  	;mov	bl, dh
   991 00000583 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   992 00000586 007719                  	add	[edi+TrackInfo.VibPos], dh
   993 00000589 88DE                    	mov	dh, bl ; 01/10/2017
   994 0000058B C0EB02                  	shr     bl, 2
   995                                  	;and	bx, 1Fh
   996                                  	;mov	al, [SinTable+bx]
   997 0000058E 83E31F                  	and	ebx, 1Fh
   998 00000591 8A83[E0500000]          	mov	al, [SinTable+ebx]
   999 00000597 F6E2                    	mul     dl
  1000                                  	;rol	ax, 1
  1001                                  	;xchg	al, ah
  1002                                  	;and	ah, 1
  1003 00000599 66C1E807                	shr	ax, 7
  1004 0000059D 84F6                    	test    dh, dh
  1005 0000059F 7903                    	jns     short VibUp
  1006 000005A1 66F7D8                  	neg     ax
  1007                                  VibUp:          
  1008 000005A4 66034710                	add     ax, [edi+TrackInfo.Period]
  1009 000005A8 6689C3                  	mov	bx, ax
  1010                                  	;movzx	ebx, ax
  1011 000005AB 6683FB71                	cmp     bx, 113
  1012                                  	;cmp	bx, 113
  1013 000005AF 6683FB1C                	cmp	bx, 28  ; 01/10/2017
  1014 000005B3 7D06                    	jge     short NoLoVib
  1015                                  	;mov	bx, 113
  1016 000005B5 66BB1C00                	mov	bx, 28	; 01/10/2017
  1017 000005B9 EB0B                    	jmp	short NoHiVib ; 01/10/2017	
  1018                                  NoLoVib:        
  1019 000005BB 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
  1020                                  	;cmp	bx, 856
  1021 000005C0 7E04                    	jle     short NoHiVib
  1022                                  	;mov	bx, 856
  1023 000005C2 66BB600D                	mov	bx, 3424 ; 01/10/2017
  1024                                  NoHiVib:        
  1025 000005C6 6601DB                  	add     bx, bx
  1026                                  	;mov	ax, [PitchTable+bx]
  1027 000005C9 668B83[0C590000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1028 000005D0 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1029 000005D4 C3                      	retn
  1030                                  efxtoneslide:
  1031                                  PortSlide:
  1032 000005D5 E812000000              	call    VolSlide
  1033 000005DA 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1034 000005DD E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
  1035                                  efxvibslide:
  1036                                  VibSlide:
  1037 000005E2 E805000000              	call    VolSlide
  1038 000005E7 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
  1039 000005EA EB8D                    	jmp     short Vibrato  ; efxvibrato2
  1040                                  efxvolslide:
  1041                                  VolSlide:
  1042 000005EC 88D6                    	mov     dh, dl
  1043 000005EE 80E20F                  	and     dl, 0Fh
  1044 000005F1 C0EE04                  	shr     dh, 4
  1045 000005F4 8A470E                  	mov     al, [edi+TrackInfo.Volume]
  1046 000005F7 28D0                    	sub     al, dl
  1047 000005F9 7D02                    	jge     short NoLoVol
  1048 000005FB 30C0                    	xor     al, al
  1049                                  NoLoVol:        
  1050 000005FD 00F0                    	add     al, dh
  1051 000005FF 3C40                    	cmp     al, 64
  1052 00000601 7602                    	jbe     short NoHiVol
  1053 00000603 B040                    	mov     al, 64
  1054                                  NoHiVol:        
  1055 00000605 88470E                  	mov     [edi+TrackInfo.Volume], al
  1056 00000608 C3                      	retn
  1057                                  
  1058                                  efxtremolo2:
  1059                                  	; 01/10/2017 (TMODPLAY.ASM)
  1060                                  Tremolo:
  1061 00000609 88D6                    	mov     dh, dl
  1062 0000060B 6681E20FF0              	and     dx, 0F00Fh
  1063 00000610 C0EE02                  	shr     dh, 2
  1064 00000613 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1065 00000616 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1066 00000619 88DE                    	mov	dh, bl
  1067 0000061B C0EB02                  	shr     bl, 2
  1068                                  	; 01/10/2017 - TRDOS 386
  1069                                  	;and	bx, 1Fh
  1070 0000061E 83E31F                  	and	ebx, 1Fh 
  1071                                  	;mov	al, [SinTable+bx]
  1072 00000621 8A83[E0500000]          	mov     al, [SinTable+ebx]
  1073 00000627 F6E2                    	mul     dl
  1074 00000629 66C1E806                	shr	ax, 6
  1075 0000062D 84F6                    	test    dh, dh
  1076 0000062F 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1077 00000631 66F7D8                  	neg     ax
  1078                                  efxtremolof2:
  1079                                  Tremolo_1:      
  1080 00000634 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1081 00000637 00E0                    	add     al, ah
  1082 00000639 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1083 0000063B 30C0                    	xor     al, al
  1084                                  efxtremolof3:
  1085                                  Tremolo_2:       
  1086 0000063D 3C40                    	cmp     al, 64 ; 40h
  1087 0000063F 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1088 00000641 B040                    	mov     al, 64 ; 40h
  1089                                  efxtremolof4:
  1090                                  Tremolo_3:       
  1091 00000643 28E0                    	sub	al, ah  ; ****** 
  1092 00000645 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1093 00000648 C3                      	retn	
  1094                                  
  1095                                  ;--------------------------------------------------------------------------
  1096                                  ; readchannel - read the next note event from the pattern sheet
  1097                                  ;--------------------------------------------------------------------------
  1098                                  ;
  1099                                  ;--------------------------------------------------------------------------
  1100                                  ; GetTrack:   Get the next Note from a pattern.
  1101                                  ;  In:
  1102                                  ;    ds:di -  Track info Address.
  1103                                  ;    es:si -  Pattern Note Address.
  1104                                  ; Out:
  1105                                  ;    es:si -  The Next Pattern Note address.
  1106                                  ;--------------------------------------------------------------------------
  1107                                  
  1108                                  ; esi = Pattern note address
  1109                                  ; edi = Track info address
  1110                                  
  1111                                  readchannel:
  1112                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1113 00000649 66AD                    	lodsw
  1114 0000064B 86C4                    	xchg    al, ah
  1115 0000064D 88E3                    	mov	bl, ah
  1116 0000064F 80E40F                  	and     ah, 0Fh
  1117 00000652 6689C1                  	mov     cx, ax
  1118 00000655 66AD                    	lodsw
  1119 00000657 86C4                    	xchg    al, ah
  1120 00000659 88E7                    	mov     bh, ah
  1121 0000065B 80E40F                  	and     ah, 0Fh
  1122 0000065E 6689C2                  	mov     dx, ax
  1123 00000661 66895714                	mov     [edi+TrackInfo.Effect], dx
  1124                                  	; 01/10/2017 - TRDOS 386
  1125                                  	;and	bl, 0F0h
  1126 00000665 81E3F0FF0000            	and	ebx, 0FFF0h
  1127 0000066B C0EF04                  	shr     bh, 4
  1128 0000066E 08FB                    	or      bl, bh
  1129 00000670 7446                    	jz      short SetPeriod
  1130                                  SetSample:
  1131 00000672 30FF                    	xor	bh, bh
  1132                                  	;and	ebx, 0FFh
  1133 00000674 FECB                    	dec     bl
  1134 00000676 01DB                    	add     ebx, ebx
  1135 00000678 668B83[CE580000]        	mov     ax, [ModInfo.SampVol+ebx]
  1136 0000067F 88470E                  	mov     [edi+TrackInfo.Volume], al
  1137 00000682 668B83[98570000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1138 00000689 668907                  	mov     [edi+TrackInfo.Samples], ax
  1139 0000068C 668B83[D6570000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1140 00000693 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1141 00000697 668B83[14580000]        	mov     ax, [ModInfo.SampLen+ebx]
  1142 0000069E 66894708                	mov     [edi+TrackInfo.Len], ax
  1143 000006A2 668B83[52580000]        	mov     ax, [ModInfo.SampRep+ebx]
  1144 000006A9 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1145 000006AD 668B83[90580000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1146 000006B4 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1147                                  SetPeriod:      
  1148 000006B8 6685C9                  	test    cx, cx
  1149 000006BB 7425                    	jz      short SetEffect
  1150                                  
  1151 000006BD 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1152                                  	
  1153 000006C1 80FE03                  	cmp     dh, 03h
  1154                                  	;je	short SetEffect
  1155 000006C4 7428                    	je	short efxtoneporta ; 01/10/2017
  1156                                  
  1157 000006C6 66894F10                	mov     [edi+TrackInfo.Period], cx
  1158                                  	;movzx	ebx, cx
  1159 000006CA 6689CB                  	mov     bx, cx
  1160 000006CD 6601DB                  	add     bx, bx
  1161                                  	;mov	ax, [PitchTable+bx]
  1162 000006D0 668B83[0C590000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1163 000006D7 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1164 000006DB C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1165                                  SetEffect:
  1166                                  	;test	dx, dx
  1167                                  	;je	short InitNone
  1168                                  	;cmp	dh, 00h
  1169                                  	;je	InitArpeggio
  1170                                  	;cmp	dh, 03h
  1171                                  	;je	short InitTonePort
  1172                                  	;cmp	dh, 04h
  1173                                  	;je	short InitVibrato
  1174                                  	;cmp	dh, 09h
  1175                                  	;je	short SampleOfs
  1176                                  	;cmp	dh, 0Bh
  1177                                  	;je	short PosJump
  1178                                  	;cmp	dh, 0Ch
  1179                                  	;je	short SetVolume
  1180                                  	;cmp	dh, 0Dh
  1181                                  	;je	short Break
  1182                                  	;cmp	dh, 0Fh
  1183                                  	;je	SetSpeed
  1184                                  	;retn
  1185                                  
  1186                                  	; 01/10/2017 (TMODPLAY.ASM)
  1187                                  	
  1188                                  	; dx = [di+TrackInfo.Effect]
  1189                                  	
  1190 000006E2 0FB6C6                  	movzx	eax, dh
  1191 000006E5 240F                    	and	al, 0Fh
  1192 000006E7 FF2485[B84F0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1193                                  ;efxnull:
  1194                                  ;InitNone:
  1195                                  ;	retn
  1196                                  efxtoneporta:
  1197                                  	; 01/10/2017
  1198                                  	; cx = period
  1199                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1200                                  InitTonePort:
  1201 000006EE 84D2                    	test    dl, dl
  1202 000006F0 7503                    	jnz     short SetPortParm
  1203 000006F2 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1204                                  SetPortParm:    
  1205 000006F5 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1206 000006F8 66895714                	mov     [edi+TrackInfo.Effect], dx
  1207 000006FC C3                      	retn
  1208                                  efxvibrato:
  1209                                  InitVibrato:
  1210 000006FD 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1211 00000700 88C4                    	mov     ah, al
  1212                                  	;and	al, 0Fh
  1213                                  	;and	ah, 0F0h
  1214 00000702 66250FF0                	and	ax, 0F00Fh
  1215 00000706 F6C20F                  	test    dl, 0Fh
  1216 00000709 7502                    	jne     short OkDepth
  1217 0000070B 08C2                    	or      dl, al
  1218                                  OkDepth:        
  1219 0000070D F6C2F0                  	test    dl, 0F0h
  1220 00000710 7502                    	jnz     short OkRate
  1221 00000712 08E2                    	or      dl, ah
  1222                                  OkRate:         
  1223 00000714 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1224 00000717 66895714                	mov     [edi+TrackInfo.Effect], dx
  1225 0000071B 6685C9                  	test    cx, cx
  1226 0000071E 7404                    	jz      short OkPos
  1227 00000720 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1228                                  OkPos:          
  1229 00000724 C3                      	retn
  1230                                  efxsampoffset:
  1231                                  	; 01/10/2017 ; *******
  1232                                  SampleOfs:         
  1233                                  ;	test    dl, dl
  1234                                  ;	jnz     short SetSampleOfs
  1235                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1236                                  ;SetSampleOfs:
  1237                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1238 00000725 88D6                    	mov     dh, dl
  1239 00000727 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1240 0000072D 895704                  	mov     [edi+TrackInfo.Position], edx
  1241 00000730 C3                      	retn
  1242                                  efxpattjump:
  1243                                  PosJump:
  1244 00000731 8815[CED40000]          	mov     [OrderPos], dl
  1245 00000737 C605[D2D40000]40        	mov     byte [Row], 64
  1246 0000073E C3                      	retn
  1247                                  efxsetvolume:
  1248                                  SetVolume:
  1249 0000073F 80FA40                  	cmp     dl, 64
  1250 00000742 7602                    	jbe     short OkVol
  1251 00000744 B240                    	mov     dl, 64
  1252                                  OkVol:
  1253                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1254 00000746 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1255                                  	;mov	[edi+TrackInfo.Volume], dl
  1256 00000748 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1257 0000074C C3                      	retn
  1258                                  efxbreak:
  1259                                  Break:
  1260 0000074D 88D6                    	mov     dh, dl
  1261 0000074F 80E20F                  	and     dl, 0Fh
  1262 00000752 C0EE04                  	shr     dh, 4
  1263 00000755 00F6                    	add     dh, dh
  1264 00000757 00F2                    	add     dl, dh
  1265 00000759 C0E602                  	shl     dh, 2
  1266 0000075C 00F2                    	add     dl, dh
  1267 0000075E 8815[D3D40000]          	mov     [BreakRow], dl
  1268 00000764 C605[D2D40000]40        	mov     byte [Row], 64
  1269 0000076B C3                      	retn
  1270                                  efxsetspeed:
  1271                                  SetSpeed:
  1272 0000076C 84D2                    	test    dl,dl
  1273 0000076E 7431                    	je      Skip
  1274 00000770 80FA1F                  	cmp     dl,31
  1275 00000773 770D                    	ja      short SetBpm
  1276                                  SetTempo:       
  1277 00000775 8815[CFD40000]          	mov     [Tempo], dl
  1278 0000077B 8815[D0D40000]          	mov     [TempoWait], dl
  1279 00000781 C3                      	retn
  1280                                  SetBpm:
  1281 00000782 8815[D1D40000]          	mov     [Bpm], dl
  1282 00000788 B067                    	mov     al, 103
  1283 0000078A F6E2                    	mul     dl
  1284 0000078C 88E3                    	mov     bl, ah
  1285 0000078E 30FF                    	xor     bh, bh
  1286 00000790 66A1[06520000]          	mov     ax, [MixSpeed]
  1287                                  	;xor	dx, dx
  1288                                  	; 27/11/2023
  1289 00000796 31D2                    	xor	edx, edx
  1290 00000798 66F7F3                  	div     bx
  1291 0000079B 66A3[D4D40000]          	mov     [BpmSamples], ax
  1292                                  Skip:           
  1293 000007A1 C3                      	retn
  1294                                  efxarpeggio:
  1295                                  	; 01/10/2017
  1296 000007A2 84D2                    	test    dl, dl
  1297                                  	;je	efxnull
  1298 000007A4 74FB                    	je	short Skip
  1299                                  InitArpeggio:
  1300 000007A6 88D6                    	mov     dh, dl
  1301 000007A8 80E20F                  	and     dl, 0Fh
  1302 000007AB C0EE04                  	shr     dh, 4
  1303                                  	; 01/10/2017
  1304                                  	;mov	cx, 36
  1305 000007AE 66B95400                	mov	cx, 84 ; 84 notes/periods
  1306 000007B2 31DB                    	xor     ebx, ebx
  1307 000007B4 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1308                                  gt_ScanPeriod:
  1309                                  	;cmp	ax, [PeriodTable+bx]
  1310 000007B8 663B83[38500000]        	cmp	ax, [PeriodTable+ebx]
  1311 000007BF 7306                    	jae     short SetArp
  1312 000007C1 6683C302                	add     bx, 2
  1313 000007C5 E2F1                    	loop    gt_ScanPeriod
  1314                                  SetArp:         
  1315 000007C7 6601D2                  	add     dx, dx
  1316 000007CA 00DE                    	add     dh, bl
  1317 000007CC 00DA                    	add     dl, bl
  1318                                  	; 01/10/2017
  1319                                  	;mov	bx, [PeriodTable+bx]
  1320 000007CE 668B9B[38500000]        	mov	bx, [PeriodTable+ebx]
  1321                                  	;add	bx, bx
  1322 000007D5 01DB                    	add	ebx, ebx
  1323                                  	;mov	ax, [PitchTable+bx]
  1324 000007D7 668B83[0C590000]        	mov	ax, [PitchTable+ebx]
  1325 000007DE 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1326 000007E2 88F3                    	mov     bl, dh
  1327 000007E4 30FF                    	xor     bh, bh
  1328 000007E6 668B9B[38500000]        	mov	bx, [PeriodTable+ebx]
  1329                                  	;add	bx, bx
  1330 000007ED 01DB                    	add	ebx, ebx
  1331                                  	;mov	ax, [PitchTable+bx]
  1332 000007EF 668B83[0C590000]        	mov	ax, [PitchTable+ebx]
  1333 000007F6 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1334 000007FA 88D3                    	mov     bl, dl
  1335 000007FC 30FF                    	xor     bh, bh
  1336 000007FE 668B9B[38500000]        	mov	bx, [PeriodTable+ebx]
  1337                                  	;add	bx, bx
  1338 00000805 01DB                    	add	ebx, ebx
  1339                                  	;mov	ax, [PitchTable+bx]
  1340 00000807 668B83[0C590000]        	mov	ax, [PitchTable+ebx]
  1341 0000080E 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1342 00000812 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1343 00000818 C3                      	retn
  1344                                  
  1345                                  efxtremolo:
  1346                                  	; 01/10/2017 (TMODPLAY.ASM)
  1347                                  InitTremolo:
  1348 00000819 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1349 0000081C 88C4                    	mov     ah, al
  1350 0000081E 66250FF0                	and     ax, 0F00Fh
  1351 00000822 F6C20F                  	test    dl, 0Fh
  1352 00000825 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1353 00000827 08C2                    	or      dl, al
  1354                                  efxtremolof0:
  1355                                  InitTremolo_1: 
  1356 00000829 F6C2F0                  	test    dl, 0F0h
  1357 0000082C 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1358 0000082E 08E2                    	or      dl, ah
  1359                                  efxtremolof1:
  1360                                  InitTremolo_2:
  1361 00000830 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1362 00000833 66895714                	mov     [edi+TrackInfo.Effect], dx
  1363 00000837 C3                      	retn
  1364                                  
  1365                                  ;--------------------------------------------------------------------------
  1366                                  ; pollmodule - polls the module player
  1367                                  ;--------------------------------------------------------------------------
  1368                                  ;--------------------------------------------------------------------------
  1369                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1370                                  ;--------------------------------------------------------------------------
  1371                                  
  1372                                  pollmodule:
  1373                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1374 00000838 FE0D[D0D40000]          	dec     byte [TempoWait]
  1375 0000083E 7417                    	jz      short GetTracks
  1376                                  
  1377                                  	;mov	ecx, NumTracks
  1378 00000840 0FB70D[00520000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1379 00000847 BF[E4D40000]            	mov	edi, Tracks
  1380                                  BeatTracks:
  1381 0000084C E86FFCFFFF              	call	BeatTrack	
  1382 00000851 83C726                  	add	edi, TrackInfo.size
  1383 00000854 E2F6                    	loop	BeatTracks
  1384 00000856 C3                      	retn
  1385                                  GetTracks:
  1386 00000857 A0[CFD40000]            	mov     al, [Tempo]
  1387 0000085C A2[D0D40000]            	mov     [TempoWait], al
  1388                                  
  1389 00000861 8B35[E0D40000]          	mov	esi, [Note]
  1390 00000867 803D[D2D40000]40        	cmp     byte [Row], 64
  1391 0000086E 7267                    	jb      short NoPattWrap
  1392                                  
  1393 00000870 8B35[94570000]          	mov	esi, [ModInfo.Patterns]
  1394 00000876 8A1D[CED40000]          	mov     bl, [OrderPos]
  1395 0000087C 3A1D[12570000]          	cmp     bl, [ModInfo.OrderLen]
  1396 00000882 7214                    	jb      short NoOrderWrap
  1397 00000884 8A1D[13570000]          	mov     bl, [ModInfo.ReStart]
  1398 0000088A 881D[CED40000]          	mov     [OrderPos], bl
  1399 00000890 3A1D[12570000]          	cmp     bl, [ModInfo.OrderLen]
  1400 00000896 7363                    	jae     short NoUpdate
  1401                                  NoOrderWrap:    
  1402                                  	;xor	bh, bh
  1403 00000898 81E3FF000000            	and	ebx, 0FFh
  1404 0000089E 8A9B[14570000]          	mov     bl, [ModInfo.Order+ebx]
  1405                                  	; 05/10/2017
  1406                                  	;shl	ebx, 10 ; *1024
  1407 000008A4 8A0D[FF510000]          	mov	cl, [pattern_shift] ; 10 or 11
  1408 000008AA D3E3                    	shl	ebx, cl ; *1024 or *2048
  1409                                  	;
  1410 000008AC 01DE                    	add     esi, ebx
  1411 000008AE 8A1D[D3D40000]          	mov     bl, [BreakRow]
  1412 000008B4 881D[D2D40000]          	mov     [Row], bl
  1413                                  	;xor	bh, bh
  1414 000008BA 81E3FF000000            	and	ebx, 0FFh
  1415 000008C0 883D[D3D40000]          	mov     [BreakRow], bh ; 0
  1416                                  	;shl	bx, 4
  1417                                  	; 27/11/2023
  1418 000008C6 C1E304                  	shl	ebx, 4
  1419 000008C9 01DE                    	add     esi, ebx
  1420 000008CB 8935[E0D40000]          	mov     [Note], esi
  1421 000008D1 FE05[CED40000]          	inc     byte [OrderPos]
  1422                                  NoPattWrap:     
  1423 000008D7 FE05[D2D40000]          	inc     byte [Row]
  1424                                  
  1425                                  	;cld
  1426                                  	;mov	ecx, NumTracks
  1427 000008DD 0FB70D[00520000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1428 000008E4 BF[E4D40000]            	mov	edi, Tracks
  1429                                  GetTracks_next:
  1430 000008E9 51                      	push	ecx	
  1431 000008EA E85AFDFFFF              	call	GetTrack ; readchannel
  1432 000008EF 59                      	pop	ecx
  1433 000008F0 83C726                  	add	edi, TrackInfo.size
  1434 000008F3 E2F4                    	loop	GetTracks_next
  1435                                  
  1436 000008F5 8935[E0D40000]          	mov     [Note], esi
  1437                                  NoUpdate:
  1438 000008FB C3                      	retn
  1439                                  
  1440                                  ;--------------------------------------------------------------------------
  1441                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1442                                  ;  In:
  1443                                  ;   ds:si -  Track Info Address.
  1444                                  ;   ds:di -  Buffer Address.
  1445                                  ;    cx   -  Buffer Size.
  1446                                  ;--------------------------------------------------------------------------
  1447                                  
  1448                                  ; esi = Track info address
  1449                                  ; edi = Buffer address
  1450                                  ; ecx = Buffer size
  1451                                  
  1452                                  MixTrack:
  1453 000008FC 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1454 00000901 7757                    	ja      short MixLooped
  1455                                  MixNonLooped:   
  1456 00000903 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1457 00000905 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1458 00000908 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1459 0000090C 52                      	push    edx
  1460 0000090D 56                      	push    esi
  1461 0000090E 01D3                    	add     ebx, edx
  1462 00000910 01D5                    	add     ebp, edx
  1463 00000912 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1464                                  	; 01/10/2017
  1465                                  	;mov	al, [esi+TrackInfo.Volume]
  1466 00000916 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1467                                  	; ah = [esi+TrackInfo.VolDiff]
  1468 0000091A 00E0                    	add	al, ah ; ****** 
  1469 0000091C C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1470 00000920 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1471 00000923 89DE                    	mov     esi, ebx
  1472 00000925 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1473 00000927 88C7                    	mov     bh, al
  1474 00000929 88D0                    	mov     al, dl
  1475 0000092B 88F2                    	mov     dl, dh
  1476                                  	;xor	dh, dh
  1477 0000092D 81E2FF000000            	and	edx, 0FFh
  1478                                  nlMixSamp:      
  1479 00000933 39EE                    	cmp     esi, ebp
  1480 00000935 7316                    	jae     short nlMixBye
  1481 00000937 8A1E                    	mov     bl, [esi]
  1482                                  	;mov	bl, [VolTable+bx]
  1483 00000939 8A9B[CE730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1484                                  	; 17/10/2017
  1485 0000093F 001F                    	add     [edi], bl
  1486                                  	; 18/10/2017
  1487 00000941 00C4                    	add     ah, al
  1488 00000943 11D6                    	adc     esi, edx
  1489 00000945 033D[00520000]          	add	edi, [numtracks]
  1490 0000094B E2E6                    	loop    nlMixSamp
  1491                                  nlMixBye:       
  1492 0000094D 89F3                    	mov     ebx, esi
  1493 0000094F 5E                      	pop     esi
  1494 00000950 5A                      	pop     edx
  1495 00000951 29D3                    	sub     ebx, edx
  1496 00000953 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1497 00000956 88661D                  	mov     [esi+TrackInfo.Error], ah
  1498 00000959 C3                      	retn
  1499                                  MixLooped:
  1500 0000095A 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1501 0000095C 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1502 0000095F 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1503 00000963 892D[DCD40000]          	mov     [BufRep], ebp
  1504                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1505 00000969 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1506 0000096D 52                      	push    edx
  1507 0000096E 56                      	push    esi
  1508 0000096F 01D3                    	add     ebx, edx
  1509 00000971 01D5                    	add     ebp, edx
  1510 00000973 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1511                                  	; 01/10/2017
  1512                                  	;mov	al, [esi+TrackInfo.Volume]
  1513 00000977 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1514                                  	; ah = [esi+TrackInfo.VolDiff]
  1515 0000097B 00E0                    	add	al, ah ; ****** 
  1516 0000097D C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1517 00000981 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1518                                  	;mov	si, bx
  1519 00000984 89DE                    	mov	esi, ebx ; 04/09/2017
  1520 00000986 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1521 00000988 88C7                    	mov     bh, al
  1522 0000098A 88D0                    	mov     al, dl
  1523 0000098C 88F2                    	mov     dl, dh
  1524                                  	;xor	dh, dh
  1525 0000098E 81E2FF000000            	and	edx, 0FFh
  1526                                  lpMixSamp:      
  1527 00000994 39EE                    	cmp     esi, ebp
  1528 00000996 7206                    	jb      short lpMixNow
  1529 00000998 2B35[DCD40000]          	sub     esi, [BufRep]
  1530                                  lpMixNow:       
  1531 0000099E 8A1E                    	mov     bl, [esi]
  1532                                  	;mov	bl, [VolTable+bx]
  1533 000009A0 8A9B[CE730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1534                                  	; 17/10/2017
  1535 000009A6 001F                    	add     [edi], bl
  1536                                  	; 18/10/2017
  1537 000009A8 00C4                    	add     ah, al
  1538 000009AA 11D6                    	adc     esi, edx
  1539 000009AC 033D[00520000]          	add	edi, [numtracks]
  1540 000009B2 E2E0                    	loop    lpMixSamp
  1541                                  lpMixBye:       
  1542                                  ;	mov     ebx, esi
  1543                                  ;	pop     esi
  1544                                  ;	pop     edx
  1545                                  ;	sub     ebx, edx
  1546                                  ;	mov     [esi+TrackInfo.Position], ebx
  1547                                  ;	mov     [esi+TrackInfo.Error], ah
  1548                                  ;	retn
  1549 000009B4 EB97                    	jmp	short nlMixBye
  1550                                  
  1551                                  ;--------------------------------------------------------------------------
  1552                                  ; mixpoll - updates the output buffer
  1553                                  ;--------------------------------------------------------------------------
  1554                                  ;
  1555                                  ;--------------------------------------------------------------------------
  1556                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1557                                  ;  In:
  1558                                  ;    Buffer  - Buffer Address.
  1559                                  ;    Count   - Buffer Size.
  1560                                  ;--------------------------------------------------------------------------
  1561                                  
  1562                                  mixpoll:
  1563                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1564                                  	; edi = buffer address
  1565                                  	; ebx = count
  1566                                  
  1567 000009B6 60                      	pushad
  1568                                  
  1569                                  	;cld
  1570                                  NextChunk:      
  1571 000009B7 66833D[DAD40000]00      	cmp     word [BufLen], 0
  1572 000009BF 756A                    	jne     short CopyChunk
  1573                                  
  1574 000009C1 53                      	push    ebx
  1575 000009C2 57                      	push    edi
  1576                                  MixChunk:       
  1577 000009C3 BF[CEB40000]            	mov	edi, MixBuffer
  1578                                  
  1579                                  	; 17/10/2017
  1580 000009C8 0FB70D[D4D40000]        	movzx	ecx, word [BpmSamples]
  1581                                  	;mov	cx, [BpmSamples]
  1582 000009CF 893D[D6D40000]          	mov     [BufPtr], edi
  1583 000009D5 66890D[DAD40000]        	mov	[BufLen], cx
  1584                                  
  1585 000009DC 803D[00520000]04        	cmp	byte [numtracks], 4
  1586 000009E3 7602                    	jna	short ch_silence
  1587                                  	;shl	cx, 1
  1588                                  	; 27/11/2023
  1589 000009E5 D1E1                    	shl	ecx, 1 
  1590                                  ch_silence:
  1591 000009E7 B880808080              	mov	eax, 80808080h
  1592 000009EC F3AB                    	rep	stosd
  1593                                  
  1594                                  	;mov	cx, NumTracks
  1595                                  	;mov	cl, NumTracks ; 01/10/2017
  1596 000009EE 8A0D[00520000]          	mov	cl, [numtracks] ; 06/10/2017
  1597 000009F4 BE[BED40000]            	mov	esi, Tracks - TrackInfo.size
  1598                                  GetSamples_next:
  1599 000009F9 51                      	push	ecx
  1600 000009FA 83C626                  	add	esi, TrackInfo.size
  1601 000009FD 668B0D[DAD40000]        	mov	cx, [BufLen]
  1602 00000A04 8B3D[D6D40000]          	mov	edi, [BufPtr]
  1603 00000A0A E8EDFEFFFF              	call	MixTrack
  1604 00000A0F 59                      	pop	ecx
  1605 00000A10 FF05[D6D40000]          	inc	dword [BufPtr] ; 18/10/2017
  1606 00000A16 E2E1                    	loop	GetSamples_next
  1607                                  
  1608                                   	; 18/10/2017	
  1609 00000A18 8B1D[00520000]          	mov	ebx, [numtracks]
  1610 00000A1E 291D[D6D40000]          	sub	dword [BufPtr], ebx
  1611                                  
  1612 00000A24 E80FFEFFFF              	call    UpdateTracks
  1613                                  
  1614 00000A29 5F                      	pop     edi
  1615 00000A2A 5B                      	pop     ebx
  1616                                  CopyChunk:      
  1617                                  	;mov	cx, [BufLen]
  1618 00000A2B 0FB70D[DAD40000]        	movzx	ecx, word [BufLen]
  1619 00000A32 39D9                    	cmp	ecx, ebx
  1620                                  	;cmp	cx, bx
  1621 00000A34 7602                    	jbe     short MoveChunk
  1622                                  	;mov	cx, bx
  1623 00000A36 89D9                    	mov     ecx, ebx
  1624                                  MoveChunk:
  1625 00000A38 8B35[D6D40000]          	mov     esi, [BufPtr]
  1626 00000A3E 010D[D6D40000]          	add     [BufPtr], ecx
  1627 00000A44 66290D[DAD40000]        	sub     [BufLen], cx
  1628 00000A4B 29CB                    	sub     ebx, ecx
  1629                                  	; 17/10/2017 ; STEREO MIXING
  1630                                  	;rep	movsb
  1631                                  	; 18/10/2017
  1632 00000A4D 803D[00520000]04        	cmp	byte [numtracks], 4
  1633 00000A54 762F                    	jna	short _4_channels_mix ; 27/11/2023
  1634                                  	
  1635                                  _8_channels_mix:
  1636                                  	; 18/10/2017
  1637 00000A56 AD                      	lodsd 
  1638 00000A57 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1639 00000A59 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1640 00000A5C 00C6                    	add	dh, al ; ch1 + ch4
  1641 00000A5E 00E2                    	add	dl, ah ; ch2 + ch3
  1642                                  
  1643 00000A60 AD                      	lodsd
  1644 00000A61 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1645 00000A63 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1646 00000A65 C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1647                                  	; 19/10/2017
  1648 00000A68 00E6                    	add	dh, ah ; ch1 + ch4 + ch5 + ch8
  1649 00000A6A 00C2                    	add	dl, al ; ch2 + ch3 + ch6 + ch7
  1650                                  
  1651                                  	; L = ch1 + ch4 + ch5 + ch8
  1652                                  	; R = ch2 + ch3 + ch6 + ch7
  1653                                  
  1654 00000A6C 6681C28080              	add	dx, 8080h
  1655                                  
  1656                                  	; 19/10/2017
  1657 00000A71 88F4                    	mov	ah, dh
  1658 00000A73 80EC80                  	sub	ah, 80h
  1659 00000A76 30C0                    	xor	al, al
  1660 00000A78 66AB                    	stosw ; Left Channel
  1661 00000A7A 88D4                    	mov	ah, dl
  1662 00000A7C 80EC80                  	sub	ah, 80h
  1663 00000A7F 66AB                    	stosw ; Right Channel
  1664                                  
  1665 00000A81 E2D3                    	loop	_8_channels_mix
  1666                                  	
  1667 00000A83 EB21                    	jmp	short channel_mix_ok
  1668                                  	
  1669                                  _4_channels_mix:
  1670                                  	; 18/10/2017
  1671 00000A85 AD                      	lodsd 
  1672 00000A86 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1673                                  	; 19/10/2017
  1674 00000A88 C1E810                  	shr	eax, 16 ; ch3 (al), ch4 (ah)
  1675 00000A8B 00E2                    	add	dl, ah ; ch1 + ch4
  1676 00000A8D 00C6                    	add	dh, al ; ch2 + ch3
  1677                                  
  1678                                  	; L = ch1 + ch4
  1679                                  	; R = ch2 + ch3
  1680                                  
  1681                                  	; 19/10/2017
  1682 00000A8F 6681C28080              	add	dx, 8080h
  1683                                  
  1684                                  	; 19/10/2017
  1685 00000A94 88D4                    	mov	ah, dl
  1686 00000A96 80EC80                  	sub	ah, 80h
  1687 00000A99 30C0                    	xor	al, al
  1688 00000A9B 66AB                    	stosw ; Left Channel
  1689 00000A9D 88F4                    	mov	ah, dh
  1690 00000A9F 80EC80                  	sub	ah, 80h
  1691 00000AA2 66AB                    	stosw ; Right Channel
  1692                                  	
  1693 00000AA4 E2DF                    	loop	_4_channels_mix
  1694                                  
  1695                                  channel_mix_ok:
  1696 00000AA6 85DB                    	test    ebx, ebx
  1697                                  	;jnz	short NextChunk
  1698 00000AA8 0F8509FFFFFF            	jnz	NextChunk ; 17/10/2017
  1699                                  
  1700                                  	; 20/10/2017
  1701                                  	; 19/10/2017
  1702                                  	; Pan Control
  1703 00000AAE 8A0D[70E00000]          	mov	cl, [pan_shift]
  1704 00000AB4 08C9                    	or	cl, cl
  1705 00000AB6 744D                    	jz	short c_smpl_2
  1706                                  
  1707                                  	; 20/10/2017
  1708 00000AB8 BB00200000              	mov	ebx, BUFFERSIZE/4 ; 8192
  1709 00000ABD BF[00F00000]            	mov	edi, Audio_Buffer
  1710                                  
  1711 00000AC2 B508                    	mov	ch, 8
  1712 00000AC4 D2E5                    	shl	ch, cl
  1713                                  c_smpl_1:
  1714 00000AC6 8B17                    	mov	edx, [edi]
  1715 00000AC8 6689D0                  	mov	ax, dx
  1716 00000ACB 80FC80                  	cmp	ah, 80h
  1717 00000ACE 7208                    	jb	short _cs1	
  1718 00000AD0 00EC                    	add	ah, ch
  1719 00000AD2 730A                    	jnc	short _cs2
  1720 00000AD4 B4FF                    	mov	ah, 255
  1721 00000AD6 EB06                    	jmp	short _cs2
  1722                                  _cs1:
  1723 00000AD8 28EC                    	sub	ah, ch
  1724 00000ADA 7302                    	jnc	short _cs2
  1725 00000ADC B400                    	mov	ah, 0
  1726                                  _cs2:
  1727 00000ADE C1CA10                  	ror	edx, 16 ; dx = [edi+2]
  1728 00000AE1 00F4                    	add	ah, dh
  1729 00000AE3 6692                    	xchg	dx, ax ; xchg [edi+2], ax
  1730 00000AE5 80FC80                  	cmp	ah, 80h
  1731 00000AE8 7208                    	jb	short _cs3	
  1732 00000AEA 00EC                    	add	ah, ch
  1733 00000AEC 730A                    	jnc	short _cs4
  1734 00000AEE B4FF                    	mov	ah, 255
  1735 00000AF0 EB06                    	jmp	short _cs4
  1736                                  _cs3:
  1737 00000AF2 28EC                    	sub	ah, ch
  1738 00000AF4 7302                    	jnc	short _cs4
  1739 00000AF6 B400                    	mov	ah, 0
  1740                                  _cs4:
  1741 00000AF8 C1CA10                  	ror	edx, 16 ; dx = [edi]
  1742 00000AFB 00E6                    	add	dh, ah
  1743 00000AFD 8917                    	mov	[edi], edx
  1744                                  _cs5:
  1745                                  	; 20/10/2017
  1746 00000AFF 83C704                  	add	edi, 4
  1747 00000B02 4B                      	dec	ebx
  1748 00000B03 75C1                    	jnz	short c_smpl_1	
  1749                                  c_smpl_2:
  1750 00000B05 61                      	popad	
  1751 00000B06 C3                      	retn
  1752                                  
  1753                                  ;--------------------------------------------------------------------------
  1754                                  ; StartPlaying: Initializes the Sound System.
  1755                                  ;  In:
  1756                                  ;   Module Information Resources.
  1757                                  ;--------------------------------------------------------------------------
  1758                                  
  1759                                  StartPlaying:
  1760 00000B07 60                      	pushad
  1761                                  SetModParms:    
  1762 00000B08 C605[CED40000]00        	mov     byte [OrderPos], 0
  1763 00000B0F C605[CFD40000]06        	mov     byte [Tempo], DefTempo
  1764 00000B16 C605[D0D40000]06        	mov     byte [TempoWait], DefTempo
  1765 00000B1D C605[D1D40000]7D        	mov     byte [Bpm], DefBpm
  1766 00000B24 C605[D2D40000]40        	mov     byte [Row], 64
  1767 00000B2B C605[D3D40000]00        	mov     byte [BreakRow], 0
  1768 00000B32 66A1[06520000]          	mov     ax, [MixSpeed]
  1769 00000B38 31D2                    	xor     edx, edx
  1770 00000B3A 66BB3200                	mov     bx, 24*DefBpm/60
  1771 00000B3E 66F7F3                  	div     bx
  1772 00000B41 66A3[D4D40000]          	mov     [BpmSamples], ax
  1773                                  ClearTracks:    
  1774 00000B47 BF[E4D40000]            	mov     edi, Tracks
  1775                                  	; 07/10/2017
  1776                                  	;mov	ecx, NumTracks*TrackInfo.size
  1777 00000B4C B826000000              	mov	eax, TrackInfo.size
  1778 00000B51 0FB70D[00520000]        	movzx	ecx, word [numtracks]
  1779 00000B58 F7E1                    	mul	ecx
  1780 00000B5A 89C1                    	mov	ecx, eax
  1781 00000B5C 31C0                    	xor     eax, eax
  1782                                  	;cld
  1783 00000B5E F3AA                    	rep     stosb
  1784                                  
  1785 00000B60 A3[D6D40000]            	mov     [BufPtr], eax
  1786 00000B65 66A3[DAD40000]          	mov     [BufLen], ax
  1787                                  MakePitch:
  1788 00000B6B 66B80021                	mov     ax, MidCRate
  1789 00000B6F 66BBAC01                	mov     bx, 428
  1790 00000B73 66F7E3                  	mul     bx
  1791 00000B76 66F735[06520000]        	div     word [MixSpeed]
  1792 00000B7D 30F6                    	xor     dh, dh
  1793 00000B7F 88E2                    	mov     dl, ah
  1794 00000B81 88C4                    	mov     ah, al
  1795 00000B83 30C0                    	xor     al, al
  1796                                  	;mov	cx, 857
  1797 00000B85 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1798 00000B89 31DB                    	xor     ebx, ebx
  1799 00000B8B BF[0C590000]            	mov     edi, PitchTable
  1800                                  PitchLoop:      
  1801 00000B90 50                      	push    eax
  1802 00000B91 52                      	push    edx
  1803 00000B92 6639DA                  	cmp     dx, bx
  1804 00000B95 7303                    	jae     short NoDiv
  1805 00000B97 66F7F3                  	div     bx
  1806                                  NoDiv:          
  1807 00000B9A 66AB                    	stosw
  1808 00000B9C 5A                      	pop     edx
  1809 00000B9D 58                      	pop     eax
  1810                                  	;inc	bx
  1811 00000B9E 43                      	inc	ebx
  1812 00000B9F E2EF                    	loop    PitchLoop
  1813                                  MakeVolume:     
  1814 00000BA1 66B90041                	mov     cx, 16640
  1815 00000BA5 89CB                    	mov     ebx, ecx
  1816                                  VolLoop:
  1817                                  	;dec	bx
  1818                                  	; 27/11/2023
  1819 00000BA7 4B                      	dec	ebx
  1820 00000BA8 88D8                    	mov     al, bl
  1821 00000BAA F6EF                    	imul    bh
  1822                                  	;mov	[VolTable+bx], ah
  1823 00000BAC 88A3[CE730000]          	mov     [VolTable+ebx], ah
  1824 00000BB2 E2F3                    	loop    VolLoop
  1825                                  
  1826 00000BB4 61                      	popad
  1827 00000BB5 C3                      	retn
  1828                                  
  1829                                  ;--------------------------------------------------------------------------
  1830                                  ; StopPlaying: ShutDown the Sound System.
  1831                                  ;--------------------------------------------------------------------------
  1832                                  
  1833                                  StopPlaying:
  1834                                  	; 19/06/2017
  1835                                  	; Stop Playing
  1836                                  	sys	_audio, 0700h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BB6 BB00070000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BBB B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BC0 CD40                <1>  int 40h
  1837                                  	; Cancel callback service (for user)
  1838                                  	sys	_audio, 0900h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BC2 BB00090000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BC7 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BCC CD40                <1>  int 40h
  1839                                  	; Deallocate Audio Buffer (for user)
  1840                                  	sys	_audio, 0A00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BCE BB000A0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BD3 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BD8 CD40                <1>  int 40h
  1841                                  	; Disable Audio Device
  1842                                  	sys	_audio, 0C00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BDA BB000C0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BDF B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BE4 CD40                <1>  int 40h
  1843                                  
  1844 00000BE6 C3                      	retn
  1845                                  
  1846                                  ;=============================================================================
  1847                                  ; 
  1848                                  ;=============================================================================
  1849                                  
  1850                                  ;dword2str:
  1851                                  ;	; 13/11/2016 - Erdogan Tan 
  1852                                  ;	; eax = dword value
  1853                                  ;	;
  1854                                  ;	call	dwordtohex
  1855                                  ;	mov	[dword_str], edx
  1856                                  ;	mov	[dword_str+4], eax
  1857                                  ;	mov	si, dword_str
  1858                                  ;	retn
  1859                                  
  1860                                  	; 05/03/2017 (TRDOS 386)
  1861                                  	; trdos386.s (unix386.s) - 10/05/2015
  1862                                  	; Convert binary number to hexadecimal string
  1863                                  
  1864                                  ;bytetohex:
  1865                                  ;	; INPUT ->
  1866                                  ;	; 	AL = byte (binary number)
  1867                                  ;	; OUTPUT ->
  1868                                  ;	;	AX = hexadecimal string
  1869                                  ;	;
  1870                                  ;	push	ebx
  1871                                  ;	movzx	ebx, al
  1872                                  ;	shr	bl, 4
  1873                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1874                                  ;	xchg	bl, al
  1875                                  ;	and	bl, 0Fh
  1876                                  ;	mov	ah, [ebx+hex_chars] 
  1877                                  ;	pop	ebx	
  1878                                  ;	retn
  1879                                  
  1880                                  ;wordtohex:
  1881                                  ;	; INPUT ->
  1882                                  ;	; 	AX = word (binary number)
  1883                                  ;	; OUTPUT ->
  1884                                  ;	;	EAX = hexadecimal string
  1885                                  ;	;
  1886                                  ;	push	ebx
  1887                                  ;	xor	ebx, ebx
  1888                                  ;	xchg	ah, al
  1889                                  ;	push	eax
  1890                                  ;	mov	bl, ah
  1891                                  ;	shr	bl, 4
  1892                                  ;	mov	al, [ebx+hex_chars] 	 	
  1893                                  ;	mov	bl, ah
  1894                                  ;	and	bl, 0Fh
  1895                                  ;	mov	ah, [ebx+hex_chars]
  1896                                  ;	shl	eax, 16
  1897                                  ;	pop	eax
  1898                                  ;	pop	ebx
  1899                                  ;	jmp	short bytetohex
  1900                                  
  1901                                  ;dwordtohex:
  1902                                  ;	; INPUT ->
  1903                                  ;	; 	EAX = dword (binary number)
  1904                                  ;	; OUTPUT ->
  1905                                  ;	;	EDX:EAX = hexadecimal string
  1906                                  ;	;
  1907                                  ;	push	eax
  1908                                  ;	shr	eax, 16
  1909                                  ;	call	wordtohex
  1910                                  ;	mov	edx, eax
  1911                                  ;	pop	eax
  1912                                  ;	call	wordtohex
  1913                                  ;	retn
  1914                                  
  1915                                  	; 04/06/2024 (BugFix)
  1916                                  	; 24/06/2017
  1917                                  	; 19/06/2017
  1918                                  	; 05/03/2017 (TRDOS 386)
  1919                                  	; 13/11/2016 - Erdogan Tan
  1920                                  write_audio_dev_info:
  1921                                  	; BUS/DEV/FN
  1922                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1923                                  	; DEV/VENDOR
  1924                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1925                                  
  1926                                  	;mov	esi, [dev_vendor]
  1927                                  	; 04/06/2024
  1928 00000BE7 A1[C0520000]            	mov	eax, [dev_vendor]
  1929 00000BEC 0FB6D8                  	movzx	ebx, al
  1930 00000BEF 88DA                    	mov	dl, bl
  1931 00000BF1 80E30F                  	and	bl, 0Fh
  1932 00000BF4 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1933 00000BFA A2[4D520000]            	mov	[msgVendorId+3], al
  1934 00000BFF 88D3                    	mov	bl, dl
  1935 00000C01 C0EB04                  	shr	bl, 4
  1936 00000C04 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1937 00000C0A A2[4C520000]            	mov	[msgVendorId+2], al
  1938 00000C0F 88E3                    	mov	bl, ah
  1939 00000C11 88DA                    	mov	dl, bl
  1940 00000C13 80E30F                  	and	bl, 0Fh
  1941 00000C16 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1942 00000C1C A2[4B520000]            	mov	[msgVendorId+1], al
  1943 00000C21 88D3                    	mov	bl, dl
  1944 00000C23 C0EB04                  	shr	bl, 4
  1945 00000C26 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1946 00000C2C A2[4A520000]            	mov	[msgVendorId], al
  1947                                  	;shr	esi, 16
  1948                                  	; 04/06/2024
  1949 00000C31 C1E810                  	shr	eax, 16
  1950 00000C34 88C3                    	mov	bl, al
  1951 00000C36 88DA                    	mov	dl, bl
  1952 00000C38 80E30F                  	and	bl, 0Fh
  1953 00000C3B 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1954 00000C41 A2[5E520000]            	mov	[msgDevId+3], al
  1955 00000C46 88D3                    	mov	bl, dl
  1956 00000C48 C0EB04                  	shr	bl, 4
  1957 00000C4B 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1958 00000C51 A2[5D520000]            	mov	[msgDevId+2], al
  1959 00000C56 88E3                    	mov	bl, ah
  1960 00000C58 88DA                    	mov	dl, bl
  1961 00000C5A 80E30F                  	and	bl, 0Fh
  1962 00000C5D 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1963 00000C63 A2[5C520000]            	mov	[msgDevId+1], al
  1964 00000C68 88D3                    	mov	bl, dl
  1965 00000C6A C0EB04                  	shr	bl, 4
  1966 00000C6D 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1967 00000C73 A2[5B520000]            	mov	[msgDevId], al
  1968                                  
  1969                                  	;mov	esi, [bus_dev_fn]
  1970                                  	;shr	esi, 8
  1971                                  	;mov	ax, si
  1972                                  	; 04/06/2024
  1973 00000C78 A1[C4520000]            	mov	eax, [bus_dev_fn]
  1974 00000C7D C1E808                  	shr	eax, 8
  1975 00000C80 88C3                    	mov	bl, al
  1976 00000C82 88DA                    	mov	dl, bl
  1977 00000C84 80E307                  	and	bl, 7 ; bit 0,1,2
  1978 00000C87 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1979 00000C8D A2[82520000]            	mov	[msgFncNo+1], al
  1980 00000C92 88D3                    	mov	bl, dl
  1981 00000C94 C0EB03                  	shr	bl, 3
  1982 00000C97 88DA                    	mov	dl, bl
  1983 00000C99 80E30F                  	and	bl, 0Fh
  1984 00000C9C 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1985 00000CA2 A2[74520000]            	mov	[msgDevNo+1], al
  1986 00000CA7 88D3                    	mov	bl, dl
  1987 00000CA9 C0EB04                  	shr	bl, 4
  1988 00000CAC 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1989 00000CB2 A2[73520000]            	mov	[msgDevNo], al
  1990 00000CB7 88E3                    	mov	bl, ah
  1991 00000CB9 88DA                    	mov	dl, bl
  1992 00000CBB 80E30F                  	and	bl, 0Fh
  1993 00000CBE 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1994 00000CC4 A2[68520000]            	mov	[msgBusNo+1], al
  1995 00000CC9 88D3                    	mov	bl, dl
  1996 00000CCB C0EB04                  	shr	bl, 4
  1997 00000CCE 8A83[08520000]          	mov	al, [ebx+hex_chars]
  1998 00000CD4 A2[67520000]            	mov	[msgBusNo], al
  1999                                  
  2000                                  	; 24/06/2017
  2001 00000CD9 66A1[CC520000]          	mov	ax, [ac97_NamBar]
  2002 00000CDF 88C3                    	mov	bl, al
  2003 00000CE1 88DA                    	mov	dl, bl
  2004 00000CE3 80E30F                  	and	bl, 0Fh
  2005 00000CE6 8A83[08520000]          	mov	al, [ebx+hex_chars]
  2006 00000CEC A2[91520000]            	mov	[msgNamBar+3], al
  2007 00000CF1 88D3                    	mov	bl, dl
  2008 00000CF3 C0EB04                  	shr	bl, 4
  2009 00000CF6 8A83[08520000]          	mov	al, [ebx+hex_chars]
  2010 00000CFC A2[90520000]            	mov	[msgNamBar+2], al
  2011 00000D01 88E3                    	mov	bl, ah
  2012 00000D03 88DA                    	mov	dl, bl
  2013 00000D05 80E30F                  	and	bl, 0Fh
  2014 00000D08 8A83[08520000]          	mov	al, [ebx+hex_chars]
  2015 00000D0E A2[8F520000]            	mov	[msgNamBar+1], al
  2016 00000D13 88D3                    	mov	bl, dl
  2017 00000D15 C0EB04                  	shr	bl, 4
  2018 00000D18 8A83[08520000]          	mov	al, [ebx+hex_chars]
  2019 00000D1E A2[8E520000]            	mov	[msgNamBar], al
  2020                                  
  2021 00000D23 66A1[CE520000]          	mov	ax, [ac97_NabmBar]
  2022 00000D29 88C3                    	mov	bl, al
  2023 00000D2B 88DA                    	mov	dl, bl
  2024 00000D2D 80E30F                  	and	bl, 0Fh
  2025 00000D30 8A83[08520000]          	mov	al, [ebx+hex_chars]
  2026 00000D36 A2[A1520000]            	mov	[msgNabmBar+3], al
  2027 00000D3B 88D3                    	mov	bl, dl
  2028 00000D3D C0EB04                  	shr	bl, 4
  2029 00000D40 8A83[08520000]          	mov	al, [ebx+hex_chars]
  2030 00000D46 A2[A0520000]            	mov	[msgNabmBar+2], al
  2031 00000D4B 88E3                    	mov	bl, ah
  2032 00000D4D 88DA                    	mov	dl, bl
  2033 00000D4F 80E30F                  	and	bl, 0Fh
  2034 00000D52 8A83[08520000]          	mov	al, [ebx+hex_chars]
  2035 00000D58 A2[9F520000]            	mov	[msgNabmBar+1], al
  2036 00000D5D 88D3                    	mov	bl, dl
  2037 00000D5F C0EB04                  	shr	bl, 4
  2038 00000D62 8A83[08520000]          	mov	al, [ebx+hex_chars]
  2039 00000D68 A2[9E520000]            	mov	[msgNabmBar], al
  2040                                  
  2041                                  	; 24/11/2016
  2042 00000D6D 30E4                    	xor	ah, ah
  2043 00000D6F A0[D0520000]            	mov	al, [ac97_int_ln_reg]
  2044 00000D74 B10A                    	mov	cl, 10
  2045 00000D76 F6F1                    	div	cl
  2046 00000D78 660105[AA520000]        	add	[msgIRQ], ax
  2047 00000D7F 20C0                    	and	al, al
  2048 00000D81 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  2049 00000D83 A0[AB520000]            	mov	al, [msgIRQ+1]
  2050 00000D88 B420                    	mov	ah, ' '
  2051 00000D8A 66A3[AA520000]          	mov	[msgIRQ], ax
  2052                                  _w_ac97imsg_:
  2053                                  	; EBX = Message address
  2054                                  	; ECX = Max. message length (or stop on ZERO character)
  2055                                  	;	(1 to 255)
  2056                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  2057                                       	sys 	_msg, msgAC97Info, 255, 07h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000D90 BB[19520000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000D95 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000D9A BA07000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000D9F B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000DA4 CD40                <1>  int 40h
  2058 00000DA6 C3                              retn
  2059                                  
  2060                                  ;=============================================================================
  2061                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
  2062                                  ;=============================================================================
  2063                                  
  2064                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2065                                  
  2066                                  ;-----------------------------------------------------------------------------
  2067                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
  2068                                  ;-----------------------------------------------------------------------------
  2069                                  	; 22/10/2017
  2070                                  setgraphmode:
  2071                                  	;pushad
  2072 00000DA7 66B81200                	mov	ax,0012h
  2073                                  	;int	10h
  2074 00000DAB CD31                    	int 	31h
  2075 00000DAD 66BAC003                	mov	dx,3C0h
  2076 00000DB1 30C0                    	xor	al,al
  2077                                  setgraphmodel0:
  2078                                  	;out	dx,al
  2079 00000DB3 B401                    	mov	ah,1 ; outb
  2080 00000DB5 CD34                    	int	34h
  2081                                  	;out	dx,al
  2082                                  	;mov	ah,1
  2083 00000DB7 CD34                    	int	34h
  2084 00000DB9 FEC0                    	inc	al
  2085 00000DBB 3C10                    	cmp	al,10h
  2086 00000DBD 72F4                    	jb	short setgraphmodel0
  2087 00000DBF B020                    	mov	al,20h
  2088                                  	;out	dx,al
  2089                                  	;mov	ah,1
  2090 00000DC1 CD34                    	int	34h
  2091                                  	;popad
  2092 00000DC3 C3                      	retn
  2093                                  
  2094                                  ;-----------------------------------------------------------------------------
  2095                                  ; settextmode - restore the VGA 80x25x16 text mode
  2096                                  ;-----------------------------------------------------------------------------
  2097                                  	; 22/10/2017
  2098                                  settextmode:
  2099                                  	;pushad
  2100 00000DC4 66B80300                	mov	ax, 0003h
  2101                                  	;int	10h
  2102 00000DC8 CD31                    	int	31h
  2103                                  	;popad
  2104 00000DCA C3                      	retn
  2105                                  
  2106                                  ;-----------------------------------------------------------------------------
  2107                                  ; drawscopes - draw the track voices sample scopes
  2108                                  ; In:
  2109                                  ;  ESI = (current) sample buffer
  2110                                  ;-----------------------------------------------------------------------------
  2111                                  	; 27/11/2023
  2112                                  	; 29/10/2017
  2113                                  	; 28/10/2017
  2114                                  	; (ESI = Current DMA buffer offset)
  2115                                  	; 27/10/2017
  2116                                  	; 26/10/2017
  2117                                  	; 23/10/2017
  2118                                  drawscopes:
  2119                                  	;pushad
  2120                                    	;mov	esi, g_buff
  2121                                  	;mov	esi, edx
  2122 00000DCB 31C9                    	xor     ecx, ecx	
  2123 00000DCD 31D2                    	xor     edx, edx
  2124 00000DCF 31FF                    	xor	edi, edi
  2125                                  drawscope0:
  2126 00000DD1 66AD                    	lodsw
  2127 00000DD3 80F480                  	xor	ah, 80h
  2128 00000DD6 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  2129                                  	;shl	bx, 1
  2130                                  	; 27/11/2023
  2131 00000DD9 D1E3                    	shl	ebx, 1
  2132 00000DDB 668B83[20D60000]        	mov	ax, [RowOfs+ebx]
  2133 00000DE2 668987[20D80000]        	mov	[NewScope_L+edi], ax
  2134 00000DE9 30FF                    	xor	bh, bh
  2135 00000DEB 66AD                    	lodsw
  2136 00000DED 80F480                  	xor	ah, 80h
  2137 00000DF0 88E3                    	mov	bl, ah	; Right Channel
  2138                                  	;shl	bx, 1
  2139                                  	; 27/11/2023
  2140 00000DF2 D1E3                    	shl	ebx, 1
  2141 00000DF4 668B83[20D60000]        	mov	ax, [RowOfs+ebx]
  2142 00000DFB 668987[20DA0000]        	mov	[NewScope_R+edi], ax
  2143                                  	;add	di, 2
  2144                                  	; 27/11/2023
  2145 00000E02 47                      	inc	edi
  2146 00000E03 47                      	inc	edi
  2147 00000E04 FEC1                    	inc	cl
  2148 00000E06 75C9                    	jnz	short drawscope0	
  2149                                  
  2150 00000E08 66BAC403                        mov	dx, 3C4h
  2151                                          ;mov	ax, 0802h
  2152                                          ;out	dx, ax
  2153 00000E0C 66BB0208                        mov	bx, 0802h
  2154 00000E10 B403                    	mov	ah, 3 ; outw
  2155 00000E12 CD34                    	int	34h
  2156                                  	;mov	dx, 3CEh
  2157                                  	; 27/11/2023 
  2158 00000E14 B2CE                            mov	dl, 0CEh
  2159 00000E16 B008                    	mov	al, 08h
  2160                                         ;out	dx, al
  2161 00000E18 B401                            mov	ah, 1 ; outb
  2162 00000E1A CD34                    	int	34h
  2163                                  	;inc	dx
  2164                                  	; 27/11/2023
  2165 00000E1C 42                      	inc	edx
  2166                                  
  2167                                  	; 26/10/2017
  2168 00000E1D 31F6                            xor	esi, esi
  2169                                         ;xor	edi, edi
  2170 00000E1F BB45060A00                      mov     ebx, 0A0645h
  2171                                  drawscopel4:
  2172 00000E24 B080                            mov     al, 80h
  2173                                  drawscopel2:
  2174 00000E26 50                              push    eax ; *
  2175 00000E27 52                              push    edx ; **
  2176                                  	;out	dx, al
  2177 00000E28 B401                    	mov	ah, 1 ; outb
  2178 00000E2A CD34                    	int	34h
  2179                                  
  2180 00000E2C B4FF                            mov	ah, 0FFh
  2181                                          ;mov	ecx, 32
  2182 00000E2E B120                    	mov	cl, 32
  2183 00000E30 28C0                    	sub     al, al
  2184                                  drawscopel3:
  2185                                  	; 23/10/2017
  2186 00000E32 668B96[20DC0000]                mov	dx, [OldScope_L+esi]
  2187 00000E39 663B96[20D80000]                cmp	dx, [NewScope_L+esi]
  2188 00000E40 7414                            je	short drawscopef3
  2189 00000E42 88041A                          mov	[edx+ebx], al ; L
  2190 00000E45 668B96[20D80000]                mov     dx, [NewScope_L+esi]
  2191 00000E4C 88241A                  	mov	[edx+ebx], ah ; L
  2192 00000E4F 668996[20DC0000]                mov     [OldScope_L+esi], dx
  2193                                  drawscopef3:
  2194                                  	; 27/10/2017
  2195 00000E56 668B96[20DE0000]                mov	dx, [OldScope_R+esi]
  2196 00000E5D 663B96[20DA0000]                cmp	dx, [NewScope_R+esi]
  2197 00000E64 7416                            je	short drawscopef4
  2198 00000E66 88441A26                	mov	[edx+ebx+38], al ; R
  2199 00000E6A 668B96[20DA0000]                mov     dx, [NewScope_R+esi]
  2200 00000E71 88641A26                        mov	[edx+ebx+38], ah ; R
  2201 00000E75 668996[20DE0000]                mov     [OldScope_R+esi], dx
  2202                                  drawscopef4:
  2203 00000E7C 83C610                  	add	esi, 2*8
  2204 00000E7F 43                      	inc	ebx
  2205 00000E80 E2B0                    	loop    drawscopel3
  2206                                  
  2207 00000E82 5A                              pop     edx ; **
  2208 00000E83 58                              pop     eax ; *
  2209 00000E84 81EEFE010000            	sub	esi, 2*256-2
  2210 00000E8A 83EB20                  	sub	ebx, 32
  2211 00000E8D D0E8                            shr     al, 1
  2212 00000E8F 7595                            jnz	short drawscopel2
  2213                                  	;popad
  2214 00000E91 C3                              retn
  2215                                  
  2216                                  ;=============================================================================
  2217                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  2218                                  ;=============================================================================
  2219                                  
  2220                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2221                                  
  2222                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  2223                                  
  2224                                  ;-----------------------------------------------------------------------------
  2225                                  ; EQUATES AND STRUCTURES
  2226                                  ;-----------------------------------------------------------------------------
  2227                                  
  2228                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  2229                                  ID_ILBM equ 4D424C49h
  2230                                  ID_BMHD equ 44484D42h
  2231                                  ID_CMAP equ 50414D43h
  2232                                  ID_BODY equ 59444F42h
  2233                                  
  2234                                  struc Form			; IFF/ILBM header file format
  2235 00000000 ????????                  .ID:		resd 1
  2236 00000004 ????????                  .Length:	resd 1
  2237 00000008 ????????                  .Type:	resd 1
  2238                                    .size:
  2239                                  endstruc
  2240                                  
  2241                                  struc Chunk			; IFF/ILBM header chunk format
  2242 00000000 ????????                  .ID:		resd 1
  2243 00000004 ????????                  .Length:	resd 1
  2244                                    .size:	
  2245                                  endstruc
  2246                                  
  2247                                  struc BMHD			; IFF/ILBM BMHD chunk format
  2248 00000000 ????                      .Width: 	resw 1
  2249 00000002 ????                      .Height:	resw 1
  2250 00000004 ????                      .PosX:	resw 1
  2251 00000006 ????                      .PosY:	resw 1
  2252 00000008 ??                        .Planes:	resb 1
  2253 00000009 ??                        .Masking:	resb 1
  2254 0000000A ??                        .Compression:	resb 1
  2255 0000000B ??                        .Pad:		resb 1
  2256 0000000C ????                      .Transparent:	resw 1
  2257 0000000E ??                        .AspectX	resb 1
  2258 0000000F ??                        .AspectY:	resb 1
  2259 00000010 ????                      .PageWidth:	resw 1
  2260 00000012 ????                      .PageHeight:	resw 1
  2261                                    .size:	
  2262                                  endstruc
  2263                                  
  2264                                  struc CMAP			; IFF/ILBM CMAP chunk format
  2265 00000000 <res 300h>                .Colors:	resb 768
  2266                                    .size:	
  2267                                  endstruc
  2268                                  
  2269                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  2270                                  
  2271                                  ;------------------------------------------------------------------------------
  2272                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  2273                                  ;         a value in little/big endian form to big/little endian form.
  2274                                  ;------------------------------------------------------------------------------
  2275                                  %macro	bswap   1
  2276                                          xchg    al, ah
  2277                                          rol     eax, 16
  2278                                          xchg    al, ah
  2279                                  %endmacro
  2280                                  
  2281                                  ;------------------------------------------------------------------------------
  2282                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  2283                                  ; In:
  2284                                  ;  ESI = IFF/ILBM image file address
  2285                                  ;------------------------------------------------------------------------------
  2286                                  putlbm:
  2287 00000E92 60                              pushad
  2288                                  
  2289                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  2290                                  
  2291 00000E93 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  2292 00000E99 7551                            jne     short putlbmd0
  2293 00000E9B 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  2294 00000EA2 7548                            jne     short putlbmd0
  2295                                  
  2296                                  ; get the IFF/ILBM file length in bytes
  2297                                  
  2298 00000EA4 8B4604                          mov     eax, [esi+Form.Length]
  2299                                          bswap   eax
  2276 00000EA7 86C4                <1>  xchg al, ah
  2277 00000EA9 C1C010              <1>  rol eax, 16
  2278 00000EAC 86C4                <1>  xchg al, ah
  2300 00000EAE 89C1                            mov     ecx, eax
  2301                                  
  2302                                  ; decrease the file length and updates the file pointer
  2303                                  
  2304 00000EB0 83E904                          sub     ecx, 4
  2305 00000EB3 83C60C                          add     esi, Form.size
  2306                                  
  2307                                  ; IFF/ILBM main parser body loop
  2308                                  
  2309                                  putlbml0:
  2310 00000EB6 85C9                            test    ecx, ecx
  2311 00000EB8 7E64                            jle     short putlbmd1
  2312                                  
  2313                                  ; get the next chunk ID and length in bytes
  2314                                  
  2315 00000EBA 8B1E                            mov     ebx, [esi+Chunk.ID]
  2316 00000EBC 8B4604                          mov     eax, [esi+Chunk.Length]
  2317                                          bswap   eax
  2276 00000EBF 86C4                <1>  xchg al, ah
  2277 00000EC1 C1C010              <1>  rol eax, 16
  2278 00000EC4 86C4                <1>  xchg al, ah
  2318 00000EC6 93                              xchg    ebx, eax
  2319 00000EC7 83C608                          add     esi, Chunk.size
  2320                                  
  2321                                  ; word align the chunk length and decrease the file length counter
  2322                                  
  2323 00000ECA 43                              inc     ebx
  2324 00000ECB 80E3FE                          and     bl, 0FEh ; ~1
  2325 00000ECE 83E908                          sub     ecx, Chunk.size
  2326 00000ED1 29D9                            sub     ecx, ebx
  2327                                  
  2328                                  ; check for the BMHD/CMAP/BODY chunk headers
  2329                                  
  2330 00000ED3 3D424D4844                      cmp     eax, ID_BMHD
  2331 00000ED8 7415                            je      short putlbmf0
  2332 00000EDA 3D434D4150                      cmp     eax, ID_CMAP
  2333 00000EDF 7440                            je      short putlbmf1
  2334 00000EE1 3D424F4459                      cmp     eax, ID_BODY
  2335 00000EE6 7454                            je      short putlbmf2
  2336                                  
  2337                                  ; advance to the next IFF/ILBM chunk structure
  2338                                  
  2339                                  putlbmc0:
  2340 00000EE8 01DE                            add     esi, ebx
  2341 00000EEA EBCA                            jmp     short putlbml0
  2342                                  
  2343                                  putlbmd0:
  2344 00000EEC F9                              stc
  2345 00000EED 61                              popad
  2346 00000EEE C3                              retn
  2347                                  
  2348                                  ; process the BMHD bitmap header chunk
  2349                                  
  2350                                  putlbmf0:
  2351 00000EEF 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  2352 00000EF3 75F7                            jne     short putlbmd0
  2353 00000EF5 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  2354 00000EF9 75F1                            jne     short putlbmd0
  2355 00000EFB 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  2356 00000EFF 75EB                            jne     short putlbmd0
  2357 00000F01 0FB706                          movzx   eax, word [esi+BMHD.Width]
  2358 00000F04 86C4                            xchg    al, ah
  2359 00000F06 83C007                          add     eax, 7
  2360 00000F09 C1E803                          shr     eax, 3
  2361 00000F0C A3[B8520000]                    mov     [picture.width], eax
  2362 00000F11 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  2363 00000F15 86C4                            xchg    al, ah
  2364 00000F17 A3[BC520000]                    mov     [picture.height], eax
  2365 00000F1C EBCA                            jmp     short putlbmc0
  2366                                  
  2367                                  putlbmd1:
  2368 00000F1E F8                              clc
  2369 00000F1F 61                              popad
  2370 00000F20 C3                              retn
  2371                                  
  2372                                  ; process the CMAP colormap chunk
  2373                                  
  2374                                  putlbmf1:
  2375 00000F21 66BAC803                        mov     dx, 3C8h
  2376 00000F25 30C0                            xor     al, al
  2377                                          ;out	dx, al
  2378 00000F27 B401                    	mov	ah, 1 ; outb
  2379 00000F29 CD34                    	int	34h
  2380                                          ;inc	dx
  2381                                  	; 27/11/2023
  2382 00000F2B 42                      	inc	edx
  2383                                  putlbml1:
  2384 00000F2C 8A06                            mov     al, [esi]
  2385 00000F2E C0E802                          shr     al, 2
  2386                                          ;out	dx, al
  2387                                  	;mov	ah, 1 ; outb
  2388 00000F31 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2389 00000F33 46                              inc     esi
  2390 00000F34 4B                              dec     ebx
  2391 00000F35 7FF5                            jg      short putlbml1
  2392 00000F37 E97AFFFFFF                      jmp     putlbml0
  2393                                  
  2394                                  ; process the BODY bitmap body chunk
  2395                                  
  2396                                  putlbmf2:
  2397 00000F3C 60                              pushad
  2398 00000F3D BF00000A00                      mov     edi, 0A0000h
  2399                                          ;cld
  2400 00000F42 66BACE03                        mov     dx, 3CEh
  2401                                          ;mov	ax, 0FF08h
  2402                                          ;out	dx, ax
  2403 00000F46 66BB08FF                	mov	bx, 0FF08h
  2404 00000F4A B403                    	mov	ah, 3 ; outw
  2405 00000F4C CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2406                                  	;mov	dx, 3C4h
  2407                                  	; 27/11/2023
  2408 00000F4E B2C4                    	mov	dl, 0C4h
  2409 00000F50 B002                            mov     al, 02h
  2410                                          ;out	dx, al
  2411 00000F52 B401                    	mov	ah, 1 ; outb
  2412 00000F54 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2413                                  	;inc	dx
  2414                                  	; 27/11/2023
  2415 00000F56 42                      	inc	edx
  2416 00000F57 8B0D[BC520000]                  mov     ecx, [picture.height]
  2417                                  putlbml2:
  2418 00000F5D 51                              push    ecx
  2419 00000F5E B011                            mov     al, 11h
  2420                                  putlbml3:
  2421 00000F60 50                              push    eax
  2422 00000F61 57                              push    edi
  2423                                          ;out	dx, al
  2424 00000F62 B401                    	mov	ah, 1 ; outb
  2425 00000F64 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2426 00000F66 8B1D[B8520000]                  mov     ebx, [picture.width]
  2427                                  putlbml4:
  2428 00000F6C AC                              lodsb
  2429 00000F6D 84C0                            test    al, al
  2430 00000F6F 7C0A                            jl      short putlbmf3
  2431 00000F71 0FB6C8                          movzx   ecx, al
  2432 00000F74 41                              inc     ecx
  2433 00000F75 29CB                            sub     ebx, ecx
  2434 00000F77 F3A4                            rep     movsb
  2435 00000F79 EB0B                            jmp     short putlbmc4
  2436                                  putlbmf3:
  2437 00000F7B F6D8                            neg     al
  2438 00000F7D 0FB6C8                          movzx   ecx, al
  2439 00000F80 41                              inc     ecx
  2440 00000F81 29CB                            sub     ebx, ecx
  2441 00000F83 AC                              lodsb
  2442 00000F84 F3AA                            rep     stosb
  2443                                  putlbmc4:
  2444 00000F86 85DB                            test    ebx, ebx
  2445 00000F88 7FE2                            jg      short putlbml4
  2446 00000F8A 5F                              pop     edi
  2447 00000F8B 58                              pop     eax
  2448 00000F8C 00C0                            add     al, al
  2449 00000F8E 73D0                            jnc     short putlbml3
  2450 00000F90 83C750                          add     edi, 80
  2451 00000F93 59                              pop     ecx
  2452 00000F94 E2C7                            loop    putlbml2
  2453 00000F96 61                      	popad
  2454 00000F97 E94CFFFFFF                      jmp	putlbmc0
  2455                                  
  2456                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  2457                                  ;------------------------------------------------------------------------------
  2458                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  2459                                  ;  ESI = IFF/ILBM image file address
  2460                                  ;------------------------------------------------------------------------------
  2461                                  
  2462                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  2463                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  2464                                  ;       MODStopModule();
  2465                                  ;       MODFreeModule(Song);
  2466                                  ;       return;
  2467                                  ;   }
  2468                                  ;   setgraphmode();
  2469                                  ;   putlbm(Logo);
  2470                                  ;   while (!kbhit())
  2471                                  ;       drawscopes(Song->NumTracks);
  2472                                  ;   settextmode();
  2473                                  ;   free(Logo);
  2474                                  ;   MODStopModule();
  2475                                  ;   MODFreeModule(Song);
  2476                                  
  2477                                  ;loadlbm:
  2478                                  ;	; ebx = ASCIIZ file name address
  2479                                  ;	; ecx = open mode (0 = open for read)	
  2480                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  2481                                  ;	jc	short loadlbm_retn
  2482                                  ;
  2483                                  ;	mov     [LBM_FileHandle], eax
  2484                                  ;
  2485                                  ;	; get file size by moving file pointer to the end of file
  2486                                  ;	; ebx = file handle/number
  2487                                  ;	; ecx : offset = 0
  2488                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  2489                                  ;	sys	_seek, eax, 0, 2
  2490                                  ;	jc	short loadlbm_cf
  2491                                  ;
  2492                                  ;	mov	[LBM_FileSize], eax
  2493                                  ;
  2494                                  ;	; move file pointer to the beginning of the file
  2495                                  ;	; ecx = 0
  2496                                  ;	; edx = 0
  2497                                  ;	;xor	ecx, ecx
  2498                                  ; 	xor	dl, dl
  2499                                  ;	; ebx = [LBM_FileHandle]
  2500                                  ;	sys	_seek
  2501                                  ;	;jc	short loadlbm_cf
  2502                                  ;
  2503                                  ;	; ebx = File handle
  2504                                  ;	; ecx = Buffer address
  2505                                  ;	; edx = Byte count
  2506                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  2507                                  ;	mov	ecx, LOGO_ADDRESS
  2508                                  ;	mov	edx, [LBM_FileSize]
  2509                                  ;	sys	_read
  2510                                  ;	jc	short loadlbm_cf
  2511                                  ;
  2512                                  ;	cmp	eax, edx  ; read count = file size ?
  2513                                  ;	;jb	short loadlbm_cf		 
  2514                                  ;loadlbm_cf:
  2515                                  ;	pushf
  2516                                  ;	sys	_close, [LBM_FileHandle]	
  2517                                  ;	popf
  2518                                  ;loadlbm_retn:
  2519                                  ;	retn	
  2520                                  ;
  2521                                  ;LOGO_FILE_NAME:
  2522                                  ;	db	"LOGO.LBM", 0
  2523                                  
  2524                                  LOGO_ERROR_MSG:
  2525 00000F9C 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  2525 00000FA5 64696E672074686520-
  2525 00000FAE 4946462F494C424D20-
  2525 00000FB7 6C6F676F2070696374-
  2525 00000FC0 75726520210D0A00   
  2526                                  
  2527                                  align 2
  2528                                  ; 22/10/2017
  2529                                  LOGO_ADDRESS:
  2530                                  ;incbin "LOGO.LBM"	  	 
  2531                                  ; 27/10/2017
  2532 00000FC8 <bin 3FF0h>             incbin "TINYPLAY.LBM"
  2533                                  
  2534                                  ;=============================================================================
  2535                                  ;               preinitialized data
  2536                                  ;=============================================================================
  2537                                  
  2538                                  ;=============================================================================
  2539                                  ; Protracker effects stuff
  2540                                  ;=============================================================================
  2541                                  
  2542                                  ;-----------------------------------------------------------------------------
  2543                                  ; Effect jump tables
  2544                                  ;-----------------------------------------------------------------------------
  2545                                  
  2546                                  align 4
  2547                                  
  2548                                  efxtable:
  2549 00004FB8 [A2070000]              	dd      efxarpeggio	; 0 - arpeggio
  2550 00004FBC [D0040000]              	dd      efxnull		; 1 - porta up
  2551 00004FC0 [D0040000]              	dd      efxnull		; 2 - porta down
  2552 00004FC4 [EE060000]              	dd      efxtoneporta	; 3 - tone porta
  2553 00004FC8 [FD060000]              	dd      efxvibrato	; 4 - vibrato
  2554 00004FCC [D0040000]              	dd      efxnull		; 5 - tone+slide
  2555 00004FD0 [D0040000]              	dd      efxnull		; 6 - vibrato+slide
  2556 00004FD4 [19080000]              	dd      efxtremolo	; 7 - tremolo
  2557 00004FD8 [D0040000]              	dd      efxnull		; 8 - unused
  2558 00004FDC [25070000]              	dd      efxsampoffset	; 9 - sample offset
  2559 00004FE0 [D0040000]              	dd      efxnull		; A - volume slide
  2560 00004FE4 [31070000]              	dd      efxpattjump	; B - pattern jump
  2561 00004FE8 [3F070000]              	dd      efxsetvolume	; C - set volume
  2562 00004FEC [4D070000]              	dd      efxbreak	; D - break pattern
  2563 00004FF0 [D0040000]              	dd      efxnull		; E - extra effects
  2564 00004FF4 [6C070000]              	dd      efxsetspeed	; F - set speed
  2565                                  
  2566                                  efxtable2:
  2567 00004FF8 [D1040000]              	dd      efxarpeggio2	; 0 - arpeggio
  2568 00004FFC [F3040000]              	dd      efxportaup	; 1 - porta up
  2569 00005000 [19050000]              	dd      efxportadown	; 2 - porta down
  2570 00005004 [40050000]              	dd      efxtoneporta2	; 3 - tone porta
  2571 00005008 [79050000]              	dd      efxvibrato2	; 4 - vibrato
  2572 0000500C [D5050000]              	dd      efxtoneslide	; 5 - tone+slide
  2573 00005010 [E2050000]              	dd      efxvibslide	; 6 - vibrato+slide
  2574 00005014 [09060000]              	dd      efxtremolo2	; 7 - tremolo
  2575 00005018 [D0040000]              	dd      efxnull		; 8 - unused
  2576 0000501C [D0040000]              	dd      efxnull		; 9 - sample offset
  2577 00005020 [EC050000]              	dd      efxvolslide	; A - volume slide
  2578 00005024 [D0040000]              	dd      efxnull		; B - pattern jump
  2579 00005028 [D0040000]              	dd      efxnull		; C - set volume
  2580 0000502C [D0040000]              	dd      efxnull		; D - break pattern
  2581 00005030 [D0040000]              	dd      efxnull		; E - extra effects
  2582 00005034 [D0040000]              	dd      efxnull		; F - set speed
  2583                                  
  2584                                  ;-----------------------------------------------------------------------------
  2585                                  ; Amiga period table
  2586                                  ;-----------------------------------------------------------------------------
  2587                                  
  2588                                  ;PeriodTable0:	
  2589                                  ;	dw	0
  2590                                  PeriodTable:
  2591 00005038 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  2591 00005041 0A000A7009E8086808-
  2591 0000504A F00780071407       
  2592 00005050 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  2592 00005059 050005B80474043404-
  2592 00005062 F803C0038A03       
  2593 00005068 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  2593 00005071 0280025C023A021A02-
  2593 0000507A FC01E001C501       
  2594 00005080 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  2594 00005089 0140012E011D010D01-
  2594 00005092 FE00F000E200       
  2595 00005098 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  2595 000050A1 00A00097008F008700-
  2595 000050AA 7F0078007100       
  2596 000050B0 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  2596 000050B9 0050004B0047004300-
  2596 000050C2 3F003C003800       
  2597 000050C8 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  2597 000050D1 002800250023002100-
  2597 000050DA 1F001E001C00       
  2598                                  
  2599                                  ;-----------------------------------------------------------------------------
  2600                                  ; Sinus wave table
  2601                                  ;-----------------------------------------------------------------------------
  2602                                  
  2603                                  SinTable:
  2604 000050E0 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  2604 000050E9 C5D4E1             
  2605 000050EC ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  2605 000050F5 E1                 
  2606 000050F6 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  2606 000050FF 19                 
  2607                                  
  2608                                  ;=============================================================================
  2609                                  ;               PLAY.ASM - DATA
  2610                                  ;=============================================================================
  2611 00005100 00                      	db	0
  2612                                  msg_usage:
  2613 00005101 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2613 0000510A 506C6179657220666F-
  2613 00005113 72205452444F532033-
  2613 0000511C 383620627920457264-
  2613 00005125 6F67616E2054616E2E-
  2613 0000512E 20                 
  2614                                  	;;db	'October 2017.',10,13
  2615                                  	;db	'November 2023.',10,13 ; 27/11/2023
  2616 0000512F 4A756E652032303234-     	db	'June 2024.',10,13
  2616 00005138 2E0A0D             
  2617 0000513B 75736167653A20746D-     	db	'usage: tmodplay filename.mod', 10,13,0
  2617 00005144 6F64706C6179206669-
  2617 0000514D 6C656E616D652E6D6F-
  2617 00005156 640A0D00           
  2618 0000515A 32392F31302F323031-     	db	'29/10/2017',10,13,0
  2618 00005163 370A0D00           
  2619                                  	;db	'27/11/2023',10,13,0
  2620 00005167 30342F31322F323032-     	db	'04/12/2023',10,13,0
  2620 00005170 330A0D00           
  2621 00005174 30322F30362F323032-     	db	'02/06/2024',10,13,0
  2621 0000517D 340A0D00           
  2622 00005181 30342F30362F323032-     	db	'04/06/2024',10,13,0
  2622 0000518A 340A0D00           
  2623                                  
  2624                                  Credits:
  2625 0000518E 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2625 00005197 506C61796572207630-
  2625 000051A0 2E3162206279204361-
  2625 000051A9 726C6F732048617361-
  2625 000051B2 6E2E204A756C792031-
  2625 000051BB 3939332E           
  2626 000051BF 0A0D00                  	db	10,13,0
  2627                                  ErrorMesg:    
  2628 000051C2 4572726F72206C6F61-     	db 'Error loading Module file.',10,13,0
  2628 000051CB 64696E67204D6F6475-
  2628 000051D4 6C652066696C652E0A-
  2628 000051DD 0D00               
  2629                                  
  2630                                  ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0
  2631                                  ;MsgFound:    db 'Sound Blaster found at Address 2'
  2632                                  ;PortText:    db 'x0h, IRQ '
  2633                                  ;IrqText:     db 'x.',10,13,0
  2634                                  
  2635                                  trdos386_err_msg:
  2636 000051DF 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  2636 000051E8 2053797374656D2063-
  2636 000051F1 616C6C206572726F72-
  2636 000051FA 20210A0D00         
  2637                                  
  2638                                  ; 07/10/2017
  2639 000051FF 0A                      pattern_shift:	db 10
  2640                                  ;numtracks:	dw 4
  2641                                  ; 18/10/2017
  2642 00005200 04000000                numtracks:	dd 4
  2643                                  
  2644                                  ;=============================================================================
  2645                                  ;               PLAYER.ASM - DATA
  2646                                  ;=============================================================================
  2647                                  
  2648                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  2649                                  ;bps:		db 8 ; bits per sample (8 or 16)
  2650                                  
  2651                                  ;19/10/2017
  2652 00005204 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  2653 00005205 10                      bps:		db 16 ; bits per sample (8 or 16)
  2654                                  
  2655                                  Sample_Rate:
  2656                                  MixSpeed:	;dw 22050 ; Hz
  2657                                  		; 27/11/2023
  2658                                  		;dw 24000 ; Hz
  2659                                  		; 02/06/2024
  2660 00005206 80BB                    		dw 48000  ; Hz		
  2661                                  
  2662                                  ; 13/11/2016
  2663 00005208 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2663 00005211 3941424344454600   
  2664                                  ;
  2665                                  msgAC97Info:	
  2666 00005219 0D0A                    		db 0Dh, 0Ah
  2667 0000521B 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2667 00005224 6F20436F6E74726F6C-
  2667 0000522D 6C6572202620436F64-
  2667 00005236 656320496E666F0D0A 
  2668 0000523F 56656E646F72204944-     		db "Vendor ID: "
  2668 00005248 3A20               
  2669 0000524A 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2669 00005253 6963652049443A20   
  2670 0000525B 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2671 00005262 4275733A20              		db "Bus: "
  2672 00005267 303068204465766963-     msgBusNo:	db "00h Device: "
  2672 00005270 653A20             
  2673 00005273 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2673 0000527C 696F6E3A20         
  2674 00005281 303068                  msgFncNo	db "00h"
  2675 00005284 0D0A                    		db 0Dh, 0Ah
  2676 00005286 4E414D4241523A20        		db "NAMBAR: "
  2677 0000528E 30303030682020          msgNamBar	db "0000h  "
  2678 00005295 4E41424D4241523A20      		db "NABMBAR: "
  2679 0000529E 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  2679 000052A7 513A20             
  2680 000052AA 3030                    msgIRQ:		dw 3030h
  2681 000052AC 0D0A00                  		db 0Dh, 0Ah, 0
  2682                                  ;
  2683                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2684                                  ;codec_id:	   dd 0
  2685                                  ;codec_chip_id:	   dd 0
  2686                                  ;codec_vendor_ids: dw 0
  2687                                  ;codec_chip_ids:   dw 0
  2688                                  
  2689                                  ;dword_str:	dd 30303030h, 30303030h
  2690                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2691                                  
  2692                                  ;=============================================================================
  2693                                  ;        	uninitialized data
  2694                                  ;=============================================================================
  2695                                  
  2696                                  bss_start:
  2697                                  
  2698                                  ABSOLUTE bss_start
  2699                                  
  2700 000052AF ??                      alignb 4
  2701                                  
  2702                                  ;------------------------------------------------------------------------------
  2703                                  ; IFF/ILBM DATA
  2704                                  ;------------------------------------------------------------------------------
  2705                                  
  2706 000052B0 ????????                LBM_FileHandle:	resd 1
  2707 000052B4 ????????                LBM_FileSize:	resd 1
  2708                                  ;
  2709 000052B8 ????????                picture.width:	resd 1 		; current picture width and height
  2710 000052BC ????????                picture.height:	resd 1
  2711                                  
  2712                                  ;------------------------------------------------------------------------------
  2713                                  
  2714 000052C0 ????????                dev_vendor:	resd 1
  2715 000052C4 ????????                bus_dev_fn:	resd 1
  2716 000052C8 ????????                stats_cmd:	resd 1
  2717 000052CC ????                    ac97_NamBar:	resw 1
  2718 000052CE ????                    ac97_NabmBar:	resw 1
  2719 000052D0 ??                      ac97_int_ln_reg: resb 1
  2720 000052D1 ??                      srb:		resb 1
  2721                                  
  2722                                  ; MODLOAD.ASM
  2723 000052D2 ????????                FileHandle:	resd 1
  2724 000052D6 <res 43Ch>              Header:		resb ModHeader.size
  2725                                  
  2726                                  ; MODPLAY.ASM
  2727                                  ;MixSpeed:	    resw 1
  2728                                  
  2729                                  ModInfo:
  2730 00005712 ??                      ModInfo.OrderLen:   resb 1
  2731 00005713 ??                      ModInfo.ReStart:    resb 1
  2732 00005714 <res 80h>               ModInfo.Order:	    resb 128
  2733 00005794 ????????                ModInfo.Patterns:   resd 1
  2734                                  
  2735 00005798 <res 3Eh>               ModInfo.SampOfs:    resw 31
  2736 000057D6 <res 3Eh>               ModInfo.SampSeg:    resw 31
  2737 00005814 <res 3Eh>               ModInfo.SampLen:    resw 31
  2738 00005852 <res 3Eh>               ModInfo.SampRep:    resw 31
  2739 00005890 <res 3Eh>               ModInfo.SampRepLen: resw 31
  2740 000058CE <res 3Eh>               ModInfo.SampVol:    resw 31
  2741                                  
  2742                                  ; MODPLAY.ASM
  2743                                  PitchTable:	;resw 857
  2744 0000590C <res 1AC2h>             		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2745 000073CE <res 4100h>             VolTable:	resb 16640
  2746                                  MixBuffer:	;resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2747 0000B4CE <res 2000h>             		resb 8192	
  2748                                  
  2749                                  ; MODPLAY.ASM
  2750 0000D4CE ??                      OrderPos:	resb 1
  2751 0000D4CF ??                      Tempo:		resb 1
  2752 0000D4D0 ??                      TempoWait:	resb 1
  2753 0000D4D1 ??                      Bpm:		resb 1
  2754 0000D4D2 ??                      Row:		resb 1
  2755 0000D4D3 ??                      BreakRow:	resb 1
  2756 0000D4D4 ????                    BpmSamples:	resw 1
  2757 0000D4D6 ????????                BufPtr:		resd 1
  2758 0000D4DA ????                    BufLen:		resw 1
  2759 0000D4DC ????????                BufRep:		resd 1
  2760 0000D4E0 ????????                Note:		resd 1
  2761                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2762                                  ; 07/10/2017
  2763 0000D4E4 <res 130h>              Tracks:		resb TrackInfo.size*8
  2764                                  
  2765 0000D614 <res Ch>                alignb 16
  2766                                  
  2767                                  ; PLAY.ASM
  2768                                  ;Scope:		resw 320
  2769 0000D620 <res 200h>              RowOfs:		resw 256
  2770                                  
  2771                                  ; 23/10/2017
  2772 0000D820 <res 200h>              NewScope_L:	resw 256
  2773 0000DA20 <res 200h>              NewScope_R:	resw 256
  2774 0000DC20 <res 200h>              OldScope_L:	resw 256
  2775 0000DE20 <res 200h>              OldScope_R:	resw 256
  2776                                  
  2777                                  mod_file_name:
  2778 0000E020 <res 50h>               		resb 80
  2779                                  
  2780                                  ; 20/10/2017 (modplay7.s, SB16)
  2781                                  ; 19/10/2017 (modplay6.s, AC97)
  2782 0000E070 ??                      pan_shift:	resb 1
  2783 0000E071 ??                      volume_level:	resb 1
  2784                                  
  2785 0000E072 <res F8Eh>              alignb 4096
  2786                                  
  2787                                  Audio_Buffer:
  2788 0000F000 <res 8000h>             		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2789                                  ;temp_buffer:
  2790                                  ;		;resb BUFFERSIZE / 4 ; 8192
  2791                                  ;		resb BUFFERSIZE / 2 ; 17/10/2017
  2792                                  
  2793 00017000 <res 9000h>             alignb 65536
  2794                                  
  2795 00020000 <res 10000h>            DMA_Buffer:	resb 65536   ; 04/12/2023 (kernel buffer test)
  2796                                  		     ; (for using sb16 dma buffer as ac97 dma buffer)		
  2797                                  		;resb 131072 ; 27/11/2023	
  2798                                  file_buffer:
  2799 00030000 <res 60000h>            		resb 65536*6
  2800                                  EOF:
