     1                                  ; ****************************************************************************
     2                                  ; tmodply2.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TMODPLY2.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 27/10/2017
     7                                  ;
     8                                  ; [ Last Modification: 27/12/2024 ]  !!! STEREO MOD PLAYING !!!
     9                                  ;
    10                                  ; Derived from 'tmodplay.s' (TMODPLAY.PRG, SB16) source code by Erdogan Tan
    11                                  ; (27/10/2017). ((Stereo mod playing with TRDOS 386 audio system calls...))
    12                                  ;
    13                                  ; <tmodplay.s> note:
    14                                  ;
    15                                  ; For 640x480x16 display, 'TNYPL211' source code ('EX1A.ASM' and 'EX1B.ASM'
    16                                  ; by Carlos Hasan, 1994) is modified in order to use previous ('modplay7.s')
    17                                  ; scope method as stereo. (Track/channel scope method -in TNYPL211 files- 
    18                                  ; is/was not applied because TRDOS 386 adaption of the tiny mod player uses 
    19                                  ; dma buffer for immediate -synchronized- displaying of sound waves.
    20                                  ; So, stereo wave display -two waves, two scopes- is normally applicable.)
    21                                  ;
    22                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    23                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    24                                  ;
    25                                  ; Stereophonic mod playing code prototype: 
    26                                  ;		'modplay6.s' (AC97) by Erdogan Tan (20/10/2017)
    27                                  ;
    28                                  ; Modified by using the source code of 'tinyply3.s' ('TINYPLY3.PRG') 
    29                                  ; by Erdogan Tan (07/10/2017)
    30                                  ;
    31                                  ; Modified from 'playwav3.s' (13/06/2017)
    32                                  ;
    33                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    34                                  ;			                     (23/06/2017)
    35                                  ;
    36                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    37                                  ;				      (04/03/2017) 
    38                                  ; Assembler: NASM 2.11
    39                                  ; ----------------------------------------------------------------------------
    40                                  ;	   nasm  tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG	
    41                                  ; ****************************************************************************
    42                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    43                                  ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    44                                  
    45                                  ; 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
   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[03000A00]            	mov	ecx, EOF+3
   137 00000005 BF[69550000]            	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 E830020000              	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[55020000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000001F B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000024 BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000029 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 0000002E CD40                <1>  int 40h
   150 00000030 E9F2010000                      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 0F82EF010000            	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[D4E20000]            	mov	edi, mod_file_name
   166                                  ScanName:       
   167 0000004A AC                      	lodsb
   168 0000004B 84C0                    	test	al, al
   169 0000004D 0F84DD010000            	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[48540000]        <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 B900000100          <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 0F8205010000            	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[8D550000]        <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 0F82E9000000            	jc	error_exit
   207                                  
   208                                  LoadMod:  
   209 000000C3 BF[D4E20000]            	mov	edi, mod_file_name
   210 000000C8 E887020000              	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[7C540000]        <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 E93D010000              	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 0F82B0000000            	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[8C550000]            	mov	[ac97_int_ln_reg], al
   237 00000101 891D[7C550000]          	mov	[dev_vendor], ebx
   238 00000107 890D[80550000]          	mov	[bus_dev_fn], ecx
   239 0000010D 668915[88550000]        	mov	[ac97_NamBar], dx
   240                                  	;mov	[ac97_NamBar], dx
   241                                  	;shr	dx, 16
   242                                  	;mov	[ac97_NabmBar], dx
   243 00000114 8915[88550000]          	mov	[ac97_NamBar], edx	
   244                                    
   245 0000011A E8E40A0000              	call	write_audio_dev_info 
   246                                  
   247                                  PlayNow: 
   248 0000011F E8FF090000              	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 BB00400000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   255 0000012E E89F080000              	call	GetSamples
   256 00000133 7277                    	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 BB00400000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   269 0000014B E882080000              	call	GetSamples
   270                                  	; 27/12/2024
   271                                  	;jc	error_exit
   272                                  
   273                                  ;	;mov	ecx, 128	; Make a lookup table
   274                                  ;	mov	cl, 128
   275                                  ;	xor     ebx, ebx	; for fastest pixel
   276                                  ;	mov     edx, 320*(100-64)	; addressing.
   277                                  ;MakeOfs:        
   278                                  ;	mov     [RowOfs+ebx], dx
   279                                  ;	mov     [RowOfs+ebx+2], dx
   280                                  ;	add     dx, 320
   281                                  ;	add     ebx, 4
   282                                  ;	loop    MakeOfs
   283                                  
   284                                  	; 27/12/2024
   285 00000150 B900010000              	mov	ecx, 256
   286                                  	; 27/10/2017
   287                                  	;mov	cx, 256
   288 00000155 31DB                    	xor	ebx, ebx
   289 00000157 BF[D0D80000]            	mov	edi, RowOfs
   290                                  MakeOfs:
   291                                  	; 29/10/2017
   292                                  	;mov	ax, 128
   293                                  	;mul	bx
   294                                  	;mov	al, ah
   295                                  	;mov	ah, 80
   296                                  	;mul	ah
   297 0000015C 89D8                    	mov	eax, ebx
   298 0000015E 66C1E007                	shl	ax, 7 ; * 128
   299 00000162 B050                    	mov	al, 80
   300 00000164 F6E4                    	mul	ah
   301 00000166 66AB                    	stosw
   302 00000168 43                      	inc	ebx
   303 00000169 E2F1                    	loop	MakeOfs
   304                                  	
   305                                  	; 23/06/2017
   306                                  	; Map DMA buffer to user's memory space
   307                                  	;sys	_audio, 0D00h, 65536, DMA_Buffer
   308                                  	;;jc	error_exit
   309                                  	; 27/11/2023
   310                                  	sys	_audio, 0D00h, 131072, DMA_Buffer
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000016B BB000D0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000170 B900000200          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000175 BA[00000200]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000017A B820000000          <1>  mov eax, %1
   110                              <1> 
   111 0000017F CD40                <1>  int 40h
   311                                  	
   312                                  	; 24/06/2017
   313                                  	; Set Master Volume Level (BL=0 or 80h)
   314                                  	; 	 	for next playing (BL>=80h)
   315                                  	sys	_audio, 0B80h, 1D1Dh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000181 BB800B0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000186 B91D1D0000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000018B B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000190 CD40                <1>  int 40h
   316                                  
   317                                  	; 20/10/2017
   318 00000192 C605[25E30000]1D        	mov	byte [volume_level], 1Dh
   319                                  
   320                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   321                                  	
   322                                  	; 27/11/2023
   323                                  	; Start	to play
   324                                  	;mov	al, [bps]
   325                                  	;shr	al, 4 ; 8 -> 0, 16 -> 1
   326                                  	;shl	al, 1 ; 16 -> 2, 8 -> 0
   327                                  	;mov	bl, [stmo]
   328                                  	;dec	bl
   329                                  	;or	bl, al
   330                                  	;mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   331                                  	;mov	bh, 4 ; start to play	
   332                                  	;sys	_audio
   333                                      
   334                                  	;; SETUP SIGNAL RESPONSE BYTE
   335                                  	;; 06/03/2017
   336                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   337                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   338                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   339                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   340                                  	;sys	_calbac
   341                                  	;jc	short error_exit
   342                                  
   343                                  	; DIRECT VGA MEMORY ACCESS
   344                                  	; bl = 0, bh = 5
   345                                  	; Direct access/map to VGA memory (0A0000h)
   346                                  
   347                                  	sys	_video, 0500h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000199 BB00050000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000019E B81F000000          <1>  mov eax, %1
   110                              <1> 
   111 000001A3 CD40                <1>  int 40h
   348 000001A5 3D00000A00              	cmp	eax, 0A0000h
   349 000001AA 7418                    	je	short _a3
   350                                  error_exit:
   351                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001AC BB[99540000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000001B1 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000001B6 BA0E000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001BB B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000001C0 CD40                <1>  int 40h
   352 000001C2 EB63                    	jmp	short Exit
   353                                  
   354                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   355                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   356                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   357                                  ;       second, or the module will sound "looped".
   358                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   359                                  ;       the polling is called from my routine, and then the irq 0 must be
   360                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   361                                  ;       samples played by the Sound Blaster. Note that some samples are
   362                                  ;       discarded in the next code, just for fun!
   363                                  
   364                                  _a3:
   365                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   366                                  	;int     31h
   367                                  
   368                                  	; 21/10/2017
   369                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   370                                  	;int	31h
   371                                  
   372                                  	; 22/10/2017
   373 000001C4 E8FA0B0000              	call	setgraphmode	; Set video mode to 640*480x16
   374                                  
   375                                  	; 22/10/2017
   376                                  	;call	loadlbm
   377                                  	;jc	short loadlbm_err
   378                                  
   379 000001C9 BE[E40F0000]            	mov	esi, LOGO_ADDRESS
   380 000001CE E8DB0C0000              	call	putlbm
   381                                  	;jnc	short loadlbm_ok
   382 000001D3 731F                    	jnc	short _a4 ; 
   383                                  
   384                                  	;mov	byte [error_color], 0Eh ; Yellow
   385                                  
   386                                  loadlbm_err:
   387                                  	; 21/10/2017
   388                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   389                                  	;int	31h
   390                                  	; 22/10/2017
   391 000001D5 E8060C0000              	call	settextmode
   392                                  
   393                                  	sys	_msg, LOGO_ERROR_MSG, 255, [error_color]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001DA BB[B80F0000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000001DF B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000001E4 8B15[F3010000]      <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001EA B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000001EF CD40                <1>  int 40h
   394 000001F1 EB34                    	jmp	short Exit
   395                                  
   396                                  	; 21/10/2017
   397                                  error_color:
   398 000001F3 0C                      	db	0Ch  ; Light Red
   399                                  	
   400                                  loadlbm_ok: 
   401                                  	; 21/10/2017
   402                                  _a4:
   403                                  	; 27/11/2023
   404                                  	; Start	to play
   405 000001F4 A0[BF540000]            	mov	al, [bps]
   406 000001F9 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   407 000001FC D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   408 000001FE 8A1D[BE540000]          	mov	bl, [stmo]
   409 00000204 FECB                    	dec	bl
   410 00000206 08C3                    	or	bl, al
   411 00000208 668B0D[C0540000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   412 0000020F B704                    	mov	bh, 4 ; start to play	
   413                                  	sys	_audio
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101                              <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000211 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000216 CD40                <1>  int 40h
   414                                  
   415                                  	; 24/06/2017
   416 00000218 E863000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   417                                  
   418                                  _s_exit:
   419 0000021D E8B0090000              	call	StopPlaying	; STOP!
   420                                  	
   421                                  	; 22/10/2017
   422                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   423                                  	;int	31h
   424 00000222 E8B90B0000              	call	settextmode
   425                                  Exit:           
   426                                  	;call	FreeModule	; Free MODule core.
   427                                  	
   428                                  	sys 	_exit	; Bye !
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101                              <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000227 B801000000          <1>  mov eax, %1
   110                              <1> 
   111 0000022C CD40                <1>  int 40h
   429                                  here:
   430 0000022E EBFE                    	jmp	short here
   431                                  
   432                                  pmsg_usage:
   433                                  	sys	_msg, msg_usage, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000230 BB[C5530000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000235 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000023A BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000023F B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000244 CD40                <1>  int 40h
   434 00000246 EBDF                    	jmp	short Exit
   435                                  
   436                                  DetectICH:
   437                                  	; 24/06/2017
   438                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   439                                          sys	_audio, 0102h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000248 BB02010000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000024D B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000252 CD40                <1>  int 40h
   440 00000254 C3                      	retn
   441                                  
   442                                  noDevMsg:
   443 00000255 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   443 0000025E 61626C6520746F2066-
   443 00000267 696E64204143393720-
   443 00000270 617564696F20646576-
   443 00000279 696365210D0A00     
   444                                  
   445                                  ;ac97_int_handler:
   446                                  ;	; 19/06/2017
   447                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   448                                  ;
   449                                  ;	sys	_rele ; return from callback service 
   450                                  ;	; we must not come here !
   451                                  ;	sys	_exit
   452                                  
   453                                  ;=============================================================================
   454                                  ;      
   455                                  ;=============================================================================
   456                                  
   457                                  	; 27/12/2024
   458                                  PlayMod:
   459                                  	; 27/11/2023
   460                                  	; 27/10/2017
   461                                  	; 19/10/2017
   462                                  	; 23/06/2017   
   463                                  	; 21/06/2017
   464                                  	; 19/06/2017
   465                                  
   466                                  	; 05/03/2017 (TRDOS 386)
   467                                  	; 14/02/2017
   468                                  	; 13/02/2017
   469                                  	; 08/12/2016
   470                                  	; 28/11/2016
   471                                  
   472                                  	; 27/11/2023
   473                                       	;jmp	short modp_gs
   474                                  p_loop:
   475 00000280 803D[8D550000]00        	cmp	byte [srb], 0
   476 00000287 761D                    	jna	short q_loop
   477 00000289 C605[8D550000]00        	mov	byte [srb], 0
   478                                  modp_gs:
   479 00000290 BF[00F00000]            	mov	edi, Audio_Buffer
   480                                  	; 19/10/2017
   481                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   482 00000295 BB00400000              	mov	ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer
   483 0000029A E833070000              	call	GetSamples
   484                                  	;jc	error_exit
   485                                  	; 27/11/2023
   486 0000029F 73DF                    	jnc	short p_loop
   487 000002A1 E906FFFFFF              	jmp	error_exit
   488                                  q_loop:
   489 000002A6 B401                    	mov     ah, 1		; any key pressed?
   490 000002A8 CD32                    	int     32h		; no, Loop.
   491 000002AA 745C                    	jz	short r_loop
   492                                  
   493 000002AC B400                    	mov     ah, 0		; flush key buffer...
   494 000002AE CD32                    	int     32h
   495                                  
   496                                  	; 19/10/2017 (modplay6.s)
   497 000002B0 3C20                    	cmp	al, 20h
   498 000002B2 740E                    	je	short change_pan
   499                                  	; 09/10/2017 (playmod5.s)
   500 000002B4 3C2B                    	cmp	al, '+' ; increase sound volume
   501 000002B6 741D                    	je	short inc_volume_level
   502 000002B8 3C2D                    	cmp	al, '-'
   503 000002BA 743C                    	je	short dec_volume_level
   504                                  
   505                                  	; 19/10/2017 (modplay6.s)
   506 000002BC 24DF                    	and	al, 0DFh
   507 000002BE 3C50                    	cmp	al, 'P'
   508 000002C0 7545                    	jne	short q_return
   509                                  
   510                                  change_pan:
   511                                  	; 19/10/2017 (modplay6.s)
   512 000002C2 8A0D[24E30000]          	mov	cl, [pan_shift]
   513 000002C8 FEC1                    	inc	cl
   514 000002CA 80E103                  	and	cl, 3
   515 000002CD 880D[24E30000]          	mov	[pan_shift], cl
   516 000002D3 EB33                    	jmp	short r_loop
   517                                  
   518                                  	; 09/10/2017 (playmod5.s)
   519                                  	; 24/06/2017 (wavplay2.s)
   520                                  inc_volume_level:
   521 000002D5 8A0D[25E30000]          	mov	cl, [volume_level]
   522 000002DB 80F91F                  	cmp	cl, 1Fh ; 31
   523 000002DE 7328                    	jnb	short r_loop
   524 000002E0 FEC1                    	inc	cl
   525                                  change_volume_level:
   526 000002E2 880D[25E30000]          	mov	[volume_level], cl
   527 000002E8 88CD                    	mov	ch, cl
   528                                  	; Set Master Volume Level
   529                                  	sys	_audio, 0B00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000002EA 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 000002EF B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000002F4 CD40                <1>  int 40h
   530 000002F6 EB10                    	jmp	short r_loop
   531                                  dec_volume_level:
   532 000002F8 8A0D[25E30000]          	mov	cl, [volume_level]
   533 000002FE 80F901                  	cmp	cl, 1 ; 1
   534 00000301 7605                    	jna	short r_loop
   535 00000303 FEC9                    	dec	cl
   536 00000305 EBDB                    	jmp	short change_volume_level
   537                                  
   538                                  q_return:
   539 00000307 C3                      	retn
   540                                  r_loop:
   541                                  	;;;
   542                                  	; 27/12/2024
   543                                  	sys	_time, 4 ; get timer ticks (18.2 ticks/second)
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000308 BB04000000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000030D B80D000000          <1>  mov eax, %1
   110                              <1> 
   111 00000312 CD40                <1>  int 40h
   544 00000314 3B05[D0E20000]          	cmp	eax, [timerticks]
   545 0000031A 0F8460FFFFFF            	je	p_loop
   546 00000320 A3[D0E20000]            	mov	[timerticks], eax
   547                                  	;;;
   548                                  
   549                                  	; 27/10/2017
   550                                  	; Get Current DMA buffer Pointer 
   551                                  	; 23/06/2017 ('modplay6.s')
   552                                  	; bh = 15, get current pointer (DMA buffer offset)
   553                                  	; bl = 0, for PCM OUT
   554                                  	; ecx = 0
   555                                  	;
   556                                  	sys	_audio, 0F00h, 0
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000325 BB000F0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000032A 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 0000032F B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000334 CD40                <1>  int 40h
   557                                  
   558                                  	; 28/10/2017
   559 00000336 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   560                                  	; 23/06/2017
   561 00000338 BE[00000200]            	mov     esi, DMA_Buffer
   562 0000033D 01C6                    	add     esi, eax	; add offset value
   563                                  	; 24/06/2017
   564                                  	;mov	ecx, DMA_Buffer + (65536 - (256*4))
   565                                  	; 27/11/2023
   566 0000033F B9[00FC0300]            	mov	ecx, DMA_Buffer + (131072 - (256*4))
   567 00000344 39CE                    	cmp	esi, ecx 
   568 00000346 7602                    	jna	short _4
   569 00000348 89CE                    	mov	esi, ecx
   570                                  _4:
   571                                  	; 23/10/2017 ('tmodplay.s')
   572 0000034A E8980A0000              	call	drawscopes
   573                                  
   574 0000034F E92CFFFFFF              	jmp	p_loop
   575                                  
   576                                  ;=============================================================================
   577                                  ;               MODLOAD.ASM
   578                                  ;=============================================================================
   579                                  
   580                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   581                                  ;	July 10th, 1993.
   582                                  
   583                                  ; STRUCTURES
   584                                  
   585                                  struc ModSample
   586 00000000 <res 16h>               .msName:	resb 22
   587 00000016 ????                    .msLength:	resw 1
   588 00000018 ??                      .msFinetune:	resb 1
   589 00000019 ??                      .msVolume:	resb 1
   590 0000001A ????                    .msRepeat:	resw 1
   591 0000001C ????                    .msRepLen:	resw 1
   592                                  .size:		; 30 bytes
   593                                  endstruc
   594                                  
   595                                  struc ModHeader
   596 00000000 <res 14h>               .mhName:	resb 20
   597 00000014 <res 3A2h>              .mhSamples:	resb ModSample.size*31
   598 000003B6 ??                      .mhOrderLen:	resb 1
   599 000003B7 ??                      .mhReStart:	resb 1
   600 000003B8 <res 80h>               .mhOrder:	resb 128
   601 00000438 ????????                .mhSign:	resw 2
   602                                  .size:		; 1084 bytes
   603                                  endstruc
   604                                  
   605                                  struc ModInfoRec
   606 00000000 ??                      .OrderLen:	resb 1
   607 00000001 ??                      .ReStart:	resb 1
   608 00000002 <res 80h>               .Order:		resb 128
   609 00000082 ????????                .Patterns:	resd 1
   610 00000086 <res 3Eh>               .SampOfs:	resw 31
   611 000000C4 <res 3Eh>               .SampSeg:	resw 31
   612 00000102 <res 3Eh>               .SampLen:	resw 31
   613 00000140 <res 3Eh>               .SampRep:	resw 31
   614 0000017E <res 3Eh>               .SampRepLen:	resw 31
   615 000001BC <res 3Eh>               .SampVol:	resw 31
   616                                  .size:		; 506 bytes	
   617                                  endstruc
   618                                  
   619                                  ; CODE
   620                                  
   621                                  ; modplay5.s
   622                                  ; 07/10/2017
   623                                  ; tinyply3.s
   624                                  ; 06/10/2017
   625                                  ; 04/10/2017
   626                                  ; /* MOD FileFormat */
   627                                  
   628                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   629                                  ID_FLT4 equ 34544C46h ; "FLT4"
   630                                  ID_8CHN equ 4E484338h ; "8CHN"
   631                                  ID_FLT8 equ 34544C46h ; "FLT8"
   632                                  
   633                                  ; CODE
   634                                  
   635                                  LoadModule:
   636                                  	; edi = file name address
   637                                  
   638 00000354 60                      	pushad
   639                                  
   640 00000355 E871010000              	call    ClearModInfo
   641                                  OpenFile:       
   642                                  	; ebx = ASCIIZ file name address
   643                                  	; ecx = open mode (0 = open for read)	
   644                                  	sys	_open, edi, 0 ; open for reading
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000035A 89FB                <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000035C 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 00000361 B805000000          <1>  mov eax, %1
   110                              <1> 
   111 00000366 CD40                <1>  int 40h
   645 00000368 0F825B010000            	jc	Failed
   646 0000036E A3[8E550000]            	mov     [FileHandle], eax
   647                                  ReadHeader:
   648                                  	; ebx = File handle
   649                                  	; ecx = Buffer address
   650                                  	; edx = Byte count
   651                                  	sys	_read, [FileHandle], Header, ModHeader.size
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000373 8B1D[8E550000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000379 B9[92550000]        <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000037E BA3C040000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000383 B803000000          <1>  mov eax, %1
   110                              <1> 
   111 00000388 CD40                <1>  int 40h
   652 0000038A 0F822A010000            	jc      CloseFile
   653                                  CheckMK:  
   654                                  	; 04/10/2017
   655 00000390 A1[CA590000]            	mov	eax, [Header+ModHeader.mhSign]
   656                                        
   657 00000395 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   658                                  	;je	short Is4chnMod
   659 0000039A 742B                    	je	short IsModFile
   660                                  CheckFLT4:
   661 0000039C 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   662                                  	;je	short Is4chnMod
   663 000003A1 7424                    	je	short IsModFile
   664                                  Check8CHN:
   665 000003A3 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   666 000003A8 740D                    	je	short Is8chnMod
   667                                  CheckFLT8:
   668 000003AA 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   669                                  	; 06/10/2017
   670 000003AF 7406                    	je	short Is8chnMod
   671 000003B1 F9                      	stc
   672 000003B2 E903010000              	jmp	CloseFile
   673                                  Is8chnMod:
   674 000003B7 C605[BA540000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   675 000003BE C605[B9540000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   676 000003C5 EB00                    	jmp	short IsModFile
   677                                  ;Is4chnMod:
   678                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   679                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   680                                  
   681                                  IsModFile:
   682 000003C7 A0[48590000]            	mov     al, [Header+ModHeader.mhOrderLen]
   683 000003CC A2[CE590000]            	mov     [ModInfo.OrderLen], al
   684                                  
   685 000003D1 A0[49590000]            	mov     al, [Header+ModHeader.mhReStart]
   686 000003D6 3A05[48590000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   687 000003DC 7202                    	jb      short SetReStart
   688 000003DE B07F                    	mov     al, 7Fh
   689                                  SetReStart:
   690 000003E0 A2[CF590000]            	mov     [ModInfo.ReStart], al
   691                                  
   692                                  	;mov	ecx, 128
   693 000003E5 66B98000                	mov	cx, 128
   694 000003E9 31D2                    	xor     edx, edx
   695 000003EB 31DB                    	xor     ebx, ebx
   696                                  CopyOrder:
   697 000003ED 8AB3[4A590000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   698 000003F3 88B3[D0590000]          	mov     [ModInfo.Order+ebx], dh
   699 000003F9 38D6                    	cmp     dh, dl
   700 000003FB 7202                    	jb      short NextOrder
   701 000003FD 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   702                                  NextOrder:
   703 000003FF 43                      	inc     ebx
   704 00000400 E2EB                    	loop    CopyOrder
   705                                  AllocPatterns:  
   706 00000402 81E2FF000000            	and	edx, 0FFh
   707                                  	; 04/10/2017
   708                                  	;inx	dx  ; 12/03/2017
   709 00000408 FEC2                    	inc	dl
   710                                  	; dl = number of patterns (04/07/2017)
   711 0000040A 8A0D[B9540000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   712 00000410 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   713                                  		     	     ; *2048 ; (byte count of patterns *64*8*4)
   714                                  	;
   715 00000412 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   716                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   717 00000414 B9[00000400]            	mov	ecx, file_buffer ; 12/03/2017
   718                                  	;
   719 00000419 890D[505A0000]          	mov	[ModInfo.Patterns], ecx
   720                                  	;
   721 0000041F 01CD                    	add	ebp, ecx ; next offset for samples
   722                                  ReadPatterns:  
   723                                  	;mov	ebx, [FileHandle] 
   724                                  	; ebx = File handle
   725                                  	; ecx = Buffer address
   726                                  	; edx = Byte count
   727                                  	sys	_read, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000421 8B1D[8E550000]      <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 00000427 B803000000          <1>  mov eax, %1
   110                              <1> 
   111 0000042C CD40                <1>  int 40h
   728 0000042E 0F8286000000            	jc      CloseFile
   729                                  
   730                                  	; patterns have been loaded here... (04/07/2017)
   731                                  
   732 00000434 BE[A6550000]            	mov	esi, Header+ModHeader.mhSamples
   733 00000439 31FF                    	xor     edi, edi
   734                                  CopySamples:
   735 0000043B 668B4616                	mov     ax, [esi+ModSample.msLength]
   736 0000043F 86E0                    	xchg    al, ah
   737                                  	;shl	ax, 1
   738                                  	; 27/11/2023
   739 00000441 D1E0                    	shl	eax, 1
   740 00000443 668987[D05A0000]        	mov     [ModInfo.SampLen+edi], ax
   741                                  	; 27/11/2023
   742 0000044A 31C0                    	xor	eax, eax
   743 0000044C 8A4619                  	mov     al, [esi+ModSample.msVolume]
   744                                  	;xor	ah, ah
   745 0000044F 668987[8A5B0000]        	mov     [ModInfo.SampVol+edi], ax
   746 00000456 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   747 0000045A 86E0                    	xchg    al, ah
   748                                  	;shl	ax, 1
   749                                  	; 27/11/2023
   750 0000045C D1E0                    	shl	eax, 1
   751 0000045E 668987[0E5B0000]        	mov     [ModInfo.SampRep+edi], ax
   752 00000465 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   753 00000469 86E0                    	xchg    al, ah
   754                                  	;shl	ax, 1
   755                                  	; 27/11/2023
   756 0000046B D1E0                    	shl	eax, 1
   757 0000046D 668987[4C5B0000]        	mov     [ModInfo.SampRepLen+edi], ax
   758 00000474 83C61E                  	add     esi, ModSample.size
   759                                  	;add	di, 2
   760                                  	; 27/11/2023
   761 00000477 47                      	inc	edi
   762 00000478 47                      	inc	edi
   763 00000479 6683FF3E                	cmp     di, 2*31
   764 0000047D 72BC                    	jb      short CopySamples
   765                                  
   766 0000047F 31F6                    	xor     esi, esi
   767                                  AllocSamples:
   768 00000481 0FB796[D05A0000]        	movzx	edx, word [ModInfo.SampLen+esi]
   769                                  	; 07/10/2017
   770                                  	;shr	dx, 4 ; ***
   771 00000488 21D2                    	and	edx, edx
   772 0000048A 7426                    	jz      short NextSample
   773                                  	;inc	dx  ; number of paragraphs ; ***
   774                                  	;shl	dx, 4 ; ***
   775 0000048C 89E8                    	mov	eax, ebp
   776 0000048E 668986[545A0000]        	mov	[ModInfo.SampOfs+esi], ax
   777 00000495 C1E810                  	shr	eax, 16
   778 00000498 668986[925A0000]        	mov	[ModInfo.SampSeg+esi], ax
   779 0000049F 89E9                    	mov	ecx, ebp
   780 000004A1 01D5                    	add	ebp, edx ; next offset for sample 
   781                                  ReadSample:
   782                                  	;mov	ebx, [FileHandle]
   783                                  	;movzx  edx, [ModInfo.SampLen+esi]
   784                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   785                                  
   786                                  	; ebx = File handle
   787                                  	; ecx = Buffer address
   788                                  	; edx = Byte count
   789                                  	sys	_read, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000004A3 8B1D[8E550000]      <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 000004A9 B803000000          <1>  mov eax, %1
   110                              <1> 
   111 000004AE CD40                <1>  int 40h
   790 000004B0 7208                    	jc      short CloseFile
   791                                  
   792                                  NextSample:
   793                                  	;add	si, 2
   794                                  	; 27/11/2023
   795 000004B2 46                      	inc	esi
   796 000004B3 46                      	inc	esi
   797 000004B4 6683FE3E                	cmp     si, 2*31
   798 000004B8 72C7                    	jb      short AllocSamples
   799                                  CloseFile:      
   800 000004BA 9C                      	pushf
   801                                  	sys	_close, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000004BB 8B1D[8E550000]      <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 000004C1 B806000000          <1>  mov eax, %1
   110                              <1> 
   111 000004C6 CD40                <1>  int 40h
   802 000004C8 9D                      	popf
   803                                  Failed:       
   804 000004C9 61                      	popad
   805 000004CA C3                      	retn
   806                                  
   807                                  FreeModule:
   808                                  	; Erdogan Tan (13/02/2017)
   809                                  	; nothing to do here for memory de-allocation
   810                                  ClearModInfo:
   811 000004CB 57                      	push	edi
   812 000004CC BF[CE590000]            	mov	edi, ModInfo
   813 000004D1 B9FA010000              	mov     ecx, ModInfoRec.size
   814                                  	;cld
   815 000004D6 30C0                    	xor     al, al
   816 000004D8 F3AA                    	rep     stosb
   817 000004DA 5F                      	pop	edi
   818 000004DB C3                      	retn
   819                                  
   820                                  ;=============================================================================
   821                                  ;               MODPLAY.ASM
   822                                  ;=============================================================================
   823                                  
   824                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   825                                  ;	July 23th, 1993.
   826                                  
   827                                  ; EQUATES
   828                                  
   829                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   830                                  DefTempo        equ 6
   831                                  DefBpm          equ 125
   832                                  MidCRate        equ 8448
   833                                  MixBufSize	equ 4096
   834                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   835                                  
   836                                  ; STRUCTURES
   837                                  
   838                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   839 00000000 ????????                .Samples:	resd 1
   840                                  ;.Position:	resw 1
   841 00000004 ????????                .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   842 00000008 ????                    .Len:		resw 1
   843 0000000A ????                    .Repeat:	resw 1
   844 0000000C ????                    .RepLen:	resw 1
   845 0000000E ??                      .Volume: 	resb 1 ; Volume
   846 0000000F ??                      .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   847                                  ;.Error:	resb 1
   848                                  ;.Reserved:	resb 1 ; 01/10/2017
   849 00000010 ????                    .Period:	resw 1 ; Period
   850 00000012 ????                    .Pitch:		resw 1 
   851 00000014 ????                    .Effect:	resw 1 ; Effect
   852 00000016 ????                    .PortTo:	resw 1 ; Toneporta wanted period
   853 00000018 ??                      .PortParm:	resb 1 ; Toneporta speed
   854 00000019 ??                      .VibPos:	resb 1 ; Vibrato wave position 
   855 0000001A ??                      .VibParm:	resb 1 ; Vibrato depth/rate
   856 0000001B ??                      .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   857 0000001C ??                      .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   858                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   859 0000001D ??                      .Error:		resb 1 ; 01/10/2017
   860 0000001E ????????????            .Arp:		resw 3
   861 00000024 ????                    .ArpIndex:	resw 1
   862                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   863                                  endstruc
   864                                  
   865                                  ; CODE
   866                                  
   867                                  ;--------------------------------------------------------------------------
   868                                  ; updatechannel - update the track using the current effect
   869                                  ;--------------------------------------------------------------------------
   870                                  ; 
   871                                  ;--------------------------------------------------------------------------
   872                                  ; 	Track:  Process the next 	 in one track.
   873                                  ;  In:
   874                                  ;    ds:di -  Track info Address.
   875                                  ;--------------------------------------------------------------------------
   876                                  
   877                                  ; edi = Track info address
   878                                  
   879                                  updatechannel:
   880                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   881                                  
   882 000004DC 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   883                                  
   884                                  	;test   dx, dx
   885                                  	;je     short None
   886                                  	;cmp    dh, 00h
   887                                  	;je     short Arpeggio
   888                                  	;cmp    dh, 01h
   889                                  	;je     short PortUp
   890                                  	;cmp    dh, 02h
   891                                  	;je     short PortDown
   892                                  	;cmp    dh, 03h
   893                                  	;je     TonePort
   894                                  	;cmp    dh, 04h
   895                                  	;je     Vibrato
   896                                  	;cmp    dh, 05h
   897                                  	;je     PortSlide
   898                                  	;cmp    dh, 06h
   899                                  	;je     VibSlide
   900                                  	;cmp    dh, 0Ah
   901                                  	;je     VolSlide
   902                                  	;retn
   903                                  
   904 000004E0 0FB6C6                  	movzx	eax, dh
   905 000004E3 240F                    	and	al, 0Fh
   906 000004E5 FF2485[BC520000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   907                                  efxnull:
   908                                  None:           
   909 000004EC C3                      	retn
   910                                  efxarpeggio2:
   911                                  	; 01/10/2017
   912 000004ED 84D2                    	test    dl, dl
   913 000004EF 74FB                    	jz      short efxnull
   914                                  Arpeggio:
   915 000004F1 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   916 000004F5 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   917 000004FA 66894712                	mov     [edi+TrackInfo.Pitch], ax
   918 000004FE 6683C302                	add     bx, 2
   919 00000502 6683FB06                	cmp     bx, 6
   920 00000506 7202                    	jb      short SetArpIndex
   921 00000508 31DB                    	xor     ebx, ebx
   922                                  SetArpIndex:
   923 0000050A 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   924 0000050E C3                      	retn
   925                                  efxportaup:
   926                                  PortUp:
   927 0000050F 30F6                    	xor     dh, dh
   928                                  	;mov	bx, [edi+TrackInfo.Period]
   929 00000511 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   930 00000515 6629D3                  	sub     bx, dx
   931                                  	;cmp	bx, 113
   932 00000518 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   933 0000051C 7D04                    	jge     short NotSmall
   934                                  	;mov	bx, 113
   935 0000051E 66BB1C00                	mov	bx, 28 ; 01/10/2017
   936                                  NotSmall:
   937 00000522 66895F10                	mov     [edi+TrackInfo.Period], bx
   938 00000526 6601DB                  	add     bx, bx
   939                                  	;mov	ax, [PitchTable+bx]
   940 00000529 668B83[C85B0000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   941 00000530 66894712                	mov     [edi+TrackInfo.Pitch], ax
   942 00000534 C3                      	retn
   943                                  efxportadown:
   944                                  PortDown:
   945 00000535 30F6                    	xor     dh, dh
   946                                  	;mov	bx, [edi+TrackInfo.Period]
   947 00000537 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   948 0000053B 6601D3                  	add     bx, dx
   949 0000053E 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   950                                  	;cmp	bx, 856
   951 00000543 7E04                    	jle     short NotBig
   952                                  	;mov	bx, 856
   953 00000545 66BB600D                	mov	bx, 3424 ; 01/10/2017
   954                                  NotBig:         
   955 00000549 66895F10                	mov     [edi+TrackInfo.Period], bx
   956 0000054D 6601DB                  	add     bx, bx
   957                                  	;mov	ax, [PitchTable+bx]
   958 00000550 668B83[C85B0000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   959 00000557 66894712                	mov     [edi+TrackInfo.Pitch], ax
   960 0000055B C3                      	retn
   961                                  efxtoneporta2:
   962                                  TonePort:
   963 0000055C 30F6                    	xor     dh, dh
   964 0000055E 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   965                                  	;mov	bx, [edi+TrackInfo.Period]
   966 00000562 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   967 00000566 6639C3                  	cmp     bx, ax
   968 00000569 7429                    	je      short NoPort
   969 0000056B 7F0D                    	jg      short PortToUp
   970                                  PortToDown:     
   971 0000056D 6601D3                  	add     bx, dx
   972 00000570 6639C3                  	cmp     bx, ax
   973 00000573 7E0D                    	jle     short SetPort
   974                                  FixPort:        
   975 00000575 6689C3                  	mov     bx, ax
   976 00000578 EB08                    	jmp     short SetPort
   977                                  PortToUp:
   978 0000057A 6629D3                  	sub     bx, dx
   979 0000057D 6639C3                  	cmp     bx, ax
   980 00000580 7CF3                    	jl      short FixPort
   981                                  SetPort:        
   982 00000582 66895F10                	mov     [edi+TrackInfo.Period], bx
   983 00000586 6601DB                  	add     bx, bx
   984                                  	;mov	ax, [PitchTable+bx]
   985 00000589 668B83[C85B0000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   986 00000590 66894712                	mov     [edi+TrackInfo.Pitch], ax
   987                                  NoPort:         
   988 00000594 C3                      	retn
   989                                  efxvibrato2:
   990                                  	; 01/10/2017
   991                                  Vibrato:
   992 00000595 88D6                    	mov     dh, dl
   993                                  	;and	dl, 0Fh
   994                                  	;shr	dh, 4
   995                                  	;shl	dh, 2
   996 00000597 6681E20FF0              	and     dx, 0F00Fh
   997 0000059C C0EE02                  	shr     dh, 2
   998                                  	;add	[edi+TrackInfo.VibPos], dh
   999                                  	;mov	dh, [edi+TrackInfo.VibPos]
  1000                                  	;mov	bl, dh
  1001 0000059F 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
  1002 000005A2 007719                  	add	[edi+TrackInfo.VibPos], dh
  1003 000005A5 88DE                    	mov	dh, bl ; 01/10/2017
  1004 000005A7 C0EB02                  	shr     bl, 2
  1005                                  	;and	bx, 1Fh
  1006                                  	;mov	al, [SinTable+bx]
  1007 000005AA 83E31F                  	and	ebx, 1Fh
  1008 000005AD 8A83[A4530000]          	mov	al, [SinTable+ebx]
  1009 000005B3 F6E2                    	mul     dl
  1010                                  	;rol	ax, 1
  1011                                  	;xchg	al, ah
  1012                                  	;and	ah, 1
  1013 000005B5 66C1E807                	shr	ax, 7
  1014 000005B9 84F6                    	test    dh, dh
  1015 000005BB 7903                    	jns     short VibUp
  1016 000005BD 66F7D8                  	neg     ax
  1017                                  VibUp:          
  1018 000005C0 66034710                	add     ax, [edi+TrackInfo.Period]
  1019 000005C4 6689C3                  	mov	bx, ax
  1020                                  	;movzx	ebx, ax
  1021 000005C7 6683FB71                	cmp     bx, 113
  1022                                  	;cmp	bx, 113
  1023 000005CB 6683FB1C                	cmp	bx, 28  ; 01/10/2017
  1024 000005CF 7D06                    	jge     short NoLoVib
  1025                                  	;mov	bx, 113
  1026 000005D1 66BB1C00                	mov	bx, 28	; 01/10/2017
  1027 000005D5 EB0B                    	jmp	short NoHiVib ; 01/10/2017	
  1028                                  NoLoVib:        
  1029 000005D7 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
  1030                                  	;cmp	bx, 856
  1031 000005DC 7E04                    	jle     short NoHiVib
  1032                                  	;mov	bx, 856
  1033 000005DE 66BB600D                	mov	bx, 3424 ; 01/10/2017
  1034                                  NoHiVib:        
  1035 000005E2 6601DB                  	add     bx, bx
  1036                                  	;mov	ax, [PitchTable+bx]
  1037 000005E5 668B83[C85B0000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1038 000005EC 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1039 000005F0 C3                      	retn
  1040                                  efxtoneslide:
  1041                                  PortSlide:
  1042 000005F1 E812000000              	call    VolSlide
  1043 000005F6 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1044 000005F9 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
  1045                                  efxvibslide:
  1046                                  VibSlide:
  1047 000005FE E805000000              	call    VolSlide
  1048 00000603 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
  1049 00000606 EB8D                    	jmp     short Vibrato  ; efxvibrato2
  1050                                  efxvolslide:
  1051                                  VolSlide:
  1052 00000608 88D6                    	mov     dh, dl
  1053 0000060A 80E20F                  	and     dl, 0Fh
  1054 0000060D C0EE04                  	shr     dh, 4
  1055 00000610 8A470E                  	mov     al, [edi+TrackInfo.Volume]
  1056 00000613 28D0                    	sub     al, dl
  1057 00000615 7D02                    	jge     short NoLoVol
  1058 00000617 30C0                    	xor     al, al
  1059                                  NoLoVol:        
  1060 00000619 00F0                    	add     al, dh
  1061 0000061B 3C40                    	cmp     al, 64
  1062 0000061D 7602                    	jbe     short NoHiVol
  1063 0000061F B040                    	mov     al, 64
  1064                                  NoHiVol:        
  1065 00000621 88470E                  	mov     [edi+TrackInfo.Volume], al
  1066 00000624 C3                      	retn
  1067                                  
  1068                                  efxtremolo2:
  1069                                  	; 01/10/2017 (TMODPLAY.ASM)
  1070                                  Tremolo:
  1071 00000625 88D6                    	mov     dh, dl
  1072 00000627 6681E20FF0              	and     dx, 0F00Fh
  1073 0000062C C0EE02                  	shr     dh, 2
  1074 0000062F 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1075 00000632 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1076 00000635 88DE                    	mov	dh, bl
  1077 00000637 C0EB02                  	shr     bl, 2
  1078                                  	; 01/10/2017 - TRDOS 386
  1079                                  	;and	bx, 1Fh
  1080 0000063A 83E31F                  	and	ebx, 1Fh 
  1081                                  	;mov	al, [SinTable+bx]
  1082 0000063D 8A83[A4530000]          	mov     al, [SinTable+ebx]
  1083 00000643 F6E2                    	mul     dl
  1084 00000645 66C1E806                	shr	ax, 6
  1085 00000649 84F6                    	test    dh, dh
  1086 0000064B 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1087 0000064D 66F7D8                  	neg     ax
  1088                                  efxtremolof2:
  1089                                  Tremolo_1:      
  1090 00000650 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1091 00000653 00E0                    	add     al, ah
  1092 00000655 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1093 00000657 30C0                    	xor     al, al
  1094                                  efxtremolof3:
  1095                                  Tremolo_2:       
  1096 00000659 3C40                    	cmp     al, 64 ; 40h
  1097 0000065B 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1098 0000065D B040                    	mov     al, 64 ; 40h
  1099                                  efxtremolof4:
  1100                                  Tremolo_3:       
  1101 0000065F 28E0                    	sub	al, ah  ; ****** 
  1102 00000661 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1103 00000664 C3                      	retn	
  1104                                  
  1105                                  ;--------------------------------------------------------------------------
  1106                                  ; readchannel - read the next note event from the pattern sheet
  1107                                  ;--------------------------------------------------------------------------
  1108                                  ;
  1109                                  ;--------------------------------------------------------------------------
  1110                                  ; GetTrack:   Get the next Note from a pattern.
  1111                                  ;  In:
  1112                                  ;    ds:di -  Track info Address.
  1113                                  ;    es:si -  Pattern Note Address.
  1114                                  ; Out:
  1115                                  ;    es:si -  The Next Pattern Note address.
  1116                                  ;--------------------------------------------------------------------------
  1117                                  
  1118                                  ; esi = Pattern note address
  1119                                  ; edi = Track info address
  1120                                  
  1121                                  readchannel:
  1122                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1123 00000665 66AD                    	lodsw
  1124 00000667 86E0                    	xchg    al, ah
  1125 00000669 88E3                    	mov	bl, ah
  1126 0000066B 80E40F                  	and     ah, 0Fh
  1127 0000066E 6689C1                  	mov     cx, ax
  1128 00000671 66AD                    	lodsw
  1129 00000673 86E0                    	xchg    al, ah
  1130 00000675 88E7                    	mov     bh, ah
  1131 00000677 80E40F                  	and     ah, 0Fh
  1132 0000067A 6689C2                  	mov     dx, ax
  1133 0000067D 66895714                	mov     [edi+TrackInfo.Effect], dx
  1134                                  	; 01/10/2017 - TRDOS 386
  1135                                  	;and	bl, 0F0h
  1136 00000681 81E3F0FF0000            	and	ebx, 0FFF0h
  1137 00000687 C0EF04                  	shr     bh, 4
  1138 0000068A 08FB                    	or      bl, bh
  1139 0000068C 7446                    	jz      short SetPeriod
  1140                                  SetSample:
  1141 0000068E 30FF                    	xor	bh, bh
  1142                                  	;and	ebx, 0FFh
  1143 00000690 FECB                    	dec     bl
  1144 00000692 01DB                    	add     ebx, ebx
  1145 00000694 668B83[8A5B0000]        	mov     ax, [ModInfo.SampVol+ebx]
  1146 0000069B 88470E                  	mov     [edi+TrackInfo.Volume], al
  1147 0000069E 668B83[545A0000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1148 000006A5 668907                  	mov     [edi+TrackInfo.Samples], ax
  1149 000006A8 668B83[925A0000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1150 000006AF 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1151 000006B3 668B83[D05A0000]        	mov     ax, [ModInfo.SampLen+ebx]
  1152 000006BA 66894708                	mov     [edi+TrackInfo.Len], ax
  1153 000006BE 668B83[0E5B0000]        	mov     ax, [ModInfo.SampRep+ebx]
  1154 000006C5 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1155 000006C9 668B83[4C5B0000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1156 000006D0 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1157                                  SetPeriod:      
  1158 000006D4 6685C9                  	test    cx, cx
  1159 000006D7 7425                    	jz      short SetEffect
  1160                                  
  1161 000006D9 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1162                                  	
  1163 000006DD 80FE03                  	cmp     dh, 03h
  1164                                  	;je	short SetEffect
  1165 000006E0 7428                    	je	short efxtoneporta ; 01/10/2017
  1166                                  
  1167 000006E2 66894F10                	mov     [edi+TrackInfo.Period], cx
  1168                                  	;movzx	ebx, cx
  1169 000006E6 6689CB                  	mov     bx, cx
  1170 000006E9 6601DB                  	add     bx, bx
  1171                                  	;mov	ax, [PitchTable+bx]
  1172 000006EC 668B83[C85B0000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1173 000006F3 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1174 000006F7 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1175                                  SetEffect:
  1176                                  	;test	dx, dx
  1177                                  	;je	short InitNone
  1178                                  	;cmp	dh, 00h
  1179                                  	;je	InitArpeggio
  1180                                  	;cmp	dh, 03h
  1181                                  	;je	short InitTonePort
  1182                                  	;cmp	dh, 04h
  1183                                  	;je	short InitVibrato
  1184                                  	;cmp	dh, 09h
  1185                                  	;je	short SampleOfs
  1186                                  	;cmp	dh, 0Bh
  1187                                  	;je	short PosJump
  1188                                  	;cmp	dh, 0Ch
  1189                                  	;je	short SetVolume
  1190                                  	;cmp	dh, 0Dh
  1191                                  	;je	short Break
  1192                                  	;cmp	dh, 0Fh
  1193                                  	;je	SetSpeed
  1194                                  	;retn
  1195                                  
  1196                                  	; 01/10/2017 (TMODPLAY.ASM)
  1197                                  	
  1198                                  	; dx = [di+TrackInfo.Effect]
  1199                                  	
  1200 000006FE 0FB6C6                  	movzx	eax, dh
  1201 00000701 240F                    	and	al, 0Fh
  1202 00000703 FF2485[7C520000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1203                                  ;efxnull:
  1204                                  ;InitNone:
  1205                                  ;	retn
  1206                                  efxtoneporta:
  1207                                  	; 01/10/2017
  1208                                  	; cx = period
  1209                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1210                                  InitTonePort:
  1211 0000070A 84D2                    	test    dl, dl
  1212 0000070C 7503                    	jnz     short SetPortParm
  1213 0000070E 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1214                                  SetPortParm:    
  1215 00000711 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1216 00000714 66895714                	mov     [edi+TrackInfo.Effect], dx
  1217 00000718 C3                      	retn
  1218                                  efxvibrato:
  1219                                  InitVibrato:
  1220 00000719 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1221 0000071C 88C4                    	mov     ah, al
  1222                                  	;and	al, 0Fh
  1223                                  	;and	ah, 0F0h
  1224 0000071E 66250FF0                	and	ax, 0F00Fh
  1225 00000722 F6C20F                  	test    dl, 0Fh
  1226 00000725 7502                    	jne     short OkDepth
  1227 00000727 08C2                    	or      dl, al
  1228                                  OkDepth:        
  1229 00000729 F6C2F0                  	test    dl, 0F0h
  1230 0000072C 7502                    	jnz     short OkRate
  1231 0000072E 08E2                    	or      dl, ah
  1232                                  OkRate:         
  1233 00000730 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1234 00000733 66895714                	mov     [edi+TrackInfo.Effect], dx
  1235 00000737 6685C9                  	test    cx, cx
  1236 0000073A 7404                    	jz      short OkPos
  1237 0000073C C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1238                                  OkPos:          
  1239 00000740 C3                      	retn
  1240                                  efxsampoffset:
  1241                                  	; 01/10/2017 ; *******
  1242                                  SampleOfs:         
  1243                                  ;	test    dl, dl
  1244                                  ;	jnz     short SetSampleOfs
  1245                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1246                                  ;SetSampleOfs:
  1247                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1248 00000741 88D6                    	mov     dh, dl
  1249 00000743 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1250 00000749 895704                  	mov     [edi+TrackInfo.Position], edx
  1251 0000074C C3                      	retn
  1252                                  efxpattjump:
  1253                                  PosJump:
  1254 0000074D 8815[8AD70000]          	mov     [OrderPos], dl
  1255 00000753 C605[8ED70000]40        	mov     byte [Row], 64
  1256 0000075A C3                      	retn
  1257                                  efxsetvolume:
  1258                                  SetVolume:
  1259 0000075B 80FA40                  	cmp     dl, 64
  1260 0000075E 7602                    	jbe     short OkVol
  1261 00000760 B240                    	mov     dl, 64
  1262                                  OkVol:
  1263                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1264 00000762 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1265                                  	;mov	[edi+TrackInfo.Volume], dl
  1266 00000764 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1267 00000768 C3                      	retn
  1268                                  efxbreak:
  1269                                  Break:
  1270 00000769 88D6                    	mov     dh, dl
  1271 0000076B 80E20F                  	and     dl, 0Fh
  1272 0000076E C0EE04                  	shr     dh, 4
  1273 00000771 00F6                    	add     dh, dh
  1274 00000773 00F2                    	add     dl, dh
  1275 00000775 C0E602                  	shl     dh, 2
  1276 00000778 00F2                    	add     dl, dh
  1277 0000077A 8815[8FD70000]          	mov     [BreakRow], dl
  1278 00000780 C605[8ED70000]40        	mov     byte [Row], 64
  1279 00000787 C3                      	retn
  1280                                  efxsetspeed:
  1281                                  SetSpeed:
  1282 00000788 84D2                    	test    dl,dl
  1283 0000078A 7431                    	je      Skip
  1284 0000078C 80FA1F                  	cmp     dl,31
  1285 0000078F 770D                    	ja      short SetBpm
  1286                                  SetTempo:       
  1287 00000791 8815[8BD70000]          	mov     [Tempo], dl
  1288 00000797 8815[8CD70000]          	mov     [TempoWait], dl
  1289 0000079D C3                      	retn
  1290                                  SetBpm:
  1291 0000079E 8815[8DD70000]          	mov     [Bpm], dl
  1292 000007A4 B067                    	mov     al, 103
  1293 000007A6 F6E2                    	mul     dl
  1294 000007A8 88E3                    	mov     bl, ah
  1295 000007AA 30FF                    	xor     bh, bh
  1296 000007AC 66A1[C0540000]          	mov     ax, [MixSpeed]
  1297                                  	;xor	dx, dx
  1298                                  	; 27/11/2023
  1299 000007B2 31D2                    	xor	edx, edx
  1300 000007B4 66F7F3                  	div     bx
  1301 000007B7 66A3[90D70000]          	mov     [BpmSamples], ax
  1302                                  Skip:           
  1303 000007BD C3                      	retn
  1304                                  efxarpeggio:
  1305                                  	; 01/10/2017
  1306 000007BE 84D2                    	test    dl, dl
  1307                                  	;je	efxnull
  1308 000007C0 74FB                    	je	short Skip
  1309                                  InitArpeggio:
  1310 000007C2 88D6                    	mov     dh, dl
  1311 000007C4 80E20F                  	and     dl, 0Fh
  1312 000007C7 C0EE04                  	shr     dh, 4
  1313                                  	; 01/10/2017
  1314                                  	;mov	cx, 36
  1315 000007CA 66B95400                	mov	cx, 84 ; 84 notes/periods
  1316 000007CE 31DB                    	xor     ebx, ebx
  1317 000007D0 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1318                                  gt_ScanPeriod:
  1319                                  	;cmp	ax, [PeriodTable+bx]
  1320 000007D4 663B83[FC520000]        	cmp	ax, [PeriodTable+ebx]
  1321 000007DB 7306                    	jae     short SetArp
  1322 000007DD 6683C302                	add     bx, 2
  1323 000007E1 E2F1                    	loop    gt_ScanPeriod
  1324                                  SetArp:         
  1325 000007E3 6601D2                  	add     dx, dx
  1326 000007E6 00DE                    	add     dh, bl
  1327 000007E8 00DA                    	add     dl, bl
  1328                                  	; 01/10/2017
  1329                                  	;mov	bx, [PeriodTable+bx]
  1330 000007EA 668B9B[FC520000]        	mov	bx, [PeriodTable+ebx]
  1331                                  	;add	bx, bx
  1332 000007F1 01DB                    	add	ebx, ebx
  1333                                  	;mov	ax, [PitchTable+bx]
  1334 000007F3 668B83[C85B0000]        	mov	ax, [PitchTable+ebx]
  1335 000007FA 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1336 000007FE 88F3                    	mov     bl, dh
  1337 00000800 30FF                    	xor     bh, bh
  1338 00000802 668B9B[FC520000]        	mov	bx, [PeriodTable+ebx]
  1339                                  	;add	bx, bx
  1340 00000809 01DB                    	add	ebx, ebx
  1341                                  	;mov	ax, [PitchTable+bx]
  1342 0000080B 668B83[C85B0000]        	mov	ax, [PitchTable+ebx]
  1343 00000812 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1344 00000816 88D3                    	mov     bl, dl
  1345 00000818 30FF                    	xor     bh, bh
  1346 0000081A 668B9B[FC520000]        	mov	bx, [PeriodTable+ebx]
  1347                                  	;add	bx, bx
  1348 00000821 01DB                    	add	ebx, ebx
  1349                                  	;mov	ax, [PitchTable+bx]
  1350 00000823 668B83[C85B0000]        	mov	ax, [PitchTable+ebx]
  1351 0000082A 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1352 0000082E 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1353 00000834 C3                      	retn
  1354                                  
  1355                                  efxtremolo:
  1356                                  	; 01/10/2017 (TMODPLAY.ASM)
  1357                                  InitTremolo:
  1358 00000835 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1359 00000838 88C4                    	mov     ah, al
  1360 0000083A 66250FF0                	and     ax, 0F00Fh
  1361 0000083E F6C20F                  	test    dl, 0Fh
  1362 00000841 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1363 00000843 08C2                    	or      dl, al
  1364                                  efxtremolof0:
  1365                                  InitTremolo_1: 
  1366 00000845 F6C2F0                  	test    dl, 0F0h
  1367 00000848 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1368 0000084A 08E2                    	or      dl, ah
  1369                                  efxtremolof1:
  1370                                  InitTremolo_2:
  1371 0000084C 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1372 0000084F 66895714                	mov     [edi+TrackInfo.Effect], dx
  1373 00000853 C3                      	retn
  1374                                  
  1375                                  ;--------------------------------------------------------------------------
  1376                                  ; pollmodule - polls the module player
  1377                                  ;--------------------------------------------------------------------------
  1378                                  ;--------------------------------------------------------------------------
  1379                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1380                                  ;--------------------------------------------------------------------------
  1381                                  
  1382                                  pollmodule:
  1383                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1384 00000854 FE0D[8CD70000]          	dec     byte [TempoWait]
  1385 0000085A 7417                    	jz      short GetTracks
  1386                                  
  1387                                  	;mov	ecx, NumTracks
  1388 0000085C 0FB70D[BA540000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1389 00000863 BF[A0D70000]            	mov	edi, Tracks
  1390                                  BeatTracks:
  1391 00000868 E86FFCFFFF              	call	BeatTrack	
  1392 0000086D 83C726                  	add	edi, TrackInfo.size
  1393 00000870 E2F6                    	loop	BeatTracks
  1394 00000872 C3                      	retn
  1395                                  GetTracks:
  1396 00000873 A0[8BD70000]            	mov     al, [Tempo]
  1397 00000878 A2[8CD70000]            	mov     [TempoWait], al
  1398                                  
  1399 0000087D 8B35[9CD70000]          	mov	esi, [Note]
  1400 00000883 803D[8ED70000]40        	cmp     byte [Row], 64
  1401 0000088A 7267                    	jb      short NoPattWrap
  1402                                  
  1403 0000088C 8B35[505A0000]          	mov	esi, [ModInfo.Patterns]
  1404 00000892 8A1D[8AD70000]          	mov     bl, [OrderPos]
  1405 00000898 3A1D[CE590000]          	cmp     bl, [ModInfo.OrderLen]
  1406 0000089E 7214                    	jb      short NoOrderWrap
  1407 000008A0 8A1D[CF590000]          	mov     bl, [ModInfo.ReStart]
  1408 000008A6 881D[8AD70000]          	mov     [OrderPos], bl
  1409 000008AC 3A1D[CE590000]          	cmp     bl, [ModInfo.OrderLen]
  1410 000008B2 7363                    	jae     short NoUpdate
  1411                                  NoOrderWrap:    
  1412                                  	;xor	bh, bh
  1413 000008B4 81E3FF000000            	and	ebx, 0FFh
  1414 000008BA 8A9B[D0590000]          	mov     bl, [ModInfo.Order+ebx]
  1415                                  	; 05/10/2017
  1416                                  	;shl	ebx, 10 ; *1024
  1417 000008C0 8A0D[B9540000]          	mov	cl, [pattern_shift] ; 10 or 11
  1418 000008C6 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1419                                  	;
  1420 000008C8 01DE                    	add     esi, ebx
  1421 000008CA 8A1D[8FD70000]          	mov     bl, [BreakRow]
  1422 000008D0 881D[8ED70000]          	mov     [Row], bl
  1423                                  	;xor	bh, bh
  1424 000008D6 81E3FF000000            	and	ebx, 0FFh
  1425 000008DC 883D[8FD70000]          	mov     [BreakRow], bh ; 0
  1426                                  	;shl	bx, 4
  1427                                  	; 27/11/2023
  1428 000008E2 C1E304                  	shl	ebx, 4
  1429 000008E5 01DE                    	add     esi, ebx
  1430 000008E7 8935[9CD70000]          	mov     [Note], esi
  1431 000008ED FE05[8AD70000]          	inc     byte [OrderPos]
  1432                                  NoPattWrap:     
  1433 000008F3 FE05[8ED70000]          	inc     byte [Row]
  1434                                  
  1435                                  	;cld
  1436                                  	;mov	ecx, NumTracks
  1437 000008F9 0FB70D[BA540000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1438 00000900 BF[A0D70000]            	mov	edi, Tracks
  1439                                  GetTracks_next:
  1440 00000905 51                      	push	ecx	
  1441 00000906 E85AFDFFFF              	call	GetTrack ; readchannel
  1442 0000090B 59                      	pop	ecx
  1443 0000090C 83C726                  	add	edi, TrackInfo.size
  1444 0000090F E2F4                    	loop	GetTracks_next
  1445                                  
  1446 00000911 8935[9CD70000]          	mov     [Note], esi
  1447                                  NoUpdate:
  1448 00000917 C3                      	retn
  1449                                  
  1450                                  ;--------------------------------------------------------------------------
  1451                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1452                                  ;  In:
  1453                                  ;   ds:si -  Track Info Address.
  1454                                  ;   ds:di -  Buffer Address.
  1455                                  ;    cx   -  Buffer Size.
  1456                                  ;--------------------------------------------------------------------------
  1457                                  
  1458                                  ; esi = Track info address
  1459                                  ; edi = Buffer address
  1460                                  ; ecx = Buffer size
  1461                                  
  1462                                  MixTrack:
  1463 00000918 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1464 0000091D 7757                    	ja      short MixLooped
  1465                                  MixNonLooped:   
  1466 0000091F 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1467 00000921 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1468 00000924 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1469 00000928 52                      	push    edx
  1470 00000929 56                      	push    esi
  1471 0000092A 01D3                    	add     ebx, edx
  1472 0000092C 01D5                    	add     ebp, edx
  1473 0000092E 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1474                                  	; 01/10/2017
  1475                                  	;mov	al, [esi+TrackInfo.Volume]
  1476 00000932 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1477                                  	; ah = [esi+TrackInfo.VolDiff]
  1478 00000936 00E0                    	add	al, ah ; ****** 
  1479 00000938 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1480 0000093C 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1481 0000093F 89DE                    	mov     esi, ebx
  1482 00000941 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1483 00000943 88C7                    	mov     bh, al
  1484 00000945 88D0                    	mov     al, dl
  1485 00000947 88F2                    	mov     dl, dh
  1486                                  	;xor	dh, dh
  1487 00000949 81E2FF000000            	and	edx, 0FFh
  1488                                  nlMixSamp:      
  1489 0000094F 39EE                    	cmp     esi, ebp
  1490 00000951 7316                    	jae     short nlMixBye
  1491 00000953 8A1E                    	mov     bl, [esi]
  1492                                  	;mov	bl, [VolTable+bx]
  1493 00000955 8A9B[8A760000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1494                                  	; 17/10/2017
  1495 0000095B 001F                    	add     [edi], bl
  1496                                  	; 18/10/2017
  1497 0000095D 00C4                    	add     ah, al
  1498 0000095F 11D6                    	adc     esi, edx
  1499 00000961 033D[BA540000]          	add	edi, [numtracks]
  1500 00000967 E2E6                    	loop    nlMixSamp
  1501                                  nlMixBye:       
  1502 00000969 89F3                    	mov     ebx, esi
  1503 0000096B 5E                      	pop     esi
  1504 0000096C 5A                      	pop     edx
  1505 0000096D 29D3                    	sub     ebx, edx
  1506 0000096F 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1507 00000972 88661D                  	mov     [esi+TrackInfo.Error], ah
  1508 00000975 C3                      	retn
  1509                                  MixLooped:
  1510 00000976 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1511 00000978 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1512 0000097B 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1513 0000097F 892D[98D70000]          	mov     [BufRep], ebp
  1514                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1515 00000985 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1516 00000989 52                      	push    edx
  1517 0000098A 56                      	push    esi
  1518 0000098B 01D3                    	add     ebx, edx
  1519 0000098D 01D5                    	add     ebp, edx
  1520 0000098F 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1521                                  	; 01/10/2017
  1522                                  	;mov	al, [esi+TrackInfo.Volume]
  1523 00000993 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1524                                  	; ah = [esi+TrackInfo.VolDiff]
  1525 00000997 00E0                    	add	al, ah ; ****** 
  1526 00000999 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1527 0000099D 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1528                                  	;mov	si, bx
  1529 000009A0 89DE                    	mov	esi, ebx ; 04/09/2017
  1530 000009A2 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1531 000009A4 88C7                    	mov     bh, al
  1532 000009A6 88D0                    	mov     al, dl
  1533 000009A8 88F2                    	mov     dl, dh
  1534                                  	;xor	dh, dh
  1535 000009AA 81E2FF000000            	and	edx, 0FFh
  1536                                  lpMixSamp:      
  1537 000009B0 39EE                    	cmp     esi, ebp
  1538 000009B2 7206                    	jb      short lpMixNow
  1539 000009B4 2B35[98D70000]          	sub     esi, [BufRep]
  1540                                  lpMixNow:       
  1541 000009BA 8A1E                    	mov     bl, [esi]
  1542                                  	;mov	bl, [VolTable+bx]
  1543 000009BC 8A9B[8A760000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1544                                  	; 17/10/2017
  1545 000009C2 001F                    	add     [edi], bl
  1546                                  	; 18/10/2017
  1547 000009C4 00C4                    	add     ah, al
  1548 000009C6 11D6                    	adc     esi, edx
  1549 000009C8 033D[BA540000]          	add	edi, [numtracks]
  1550 000009CE E2E0                    	loop    lpMixSamp
  1551                                  lpMixBye:       
  1552                                  ;	mov     ebx, esi
  1553                                  ;	pop     esi
  1554                                  ;	pop     edx
  1555                                  ;	sub     ebx, edx
  1556                                  ;	mov     [esi+TrackInfo.Position], ebx
  1557                                  ;	mov     [esi+TrackInfo.Error], ah
  1558                                  ;	retn
  1559 000009D0 EB97                    	jmp	short nlMixBye
  1560                                  
  1561                                  ;--------------------------------------------------------------------------
  1562                                  ; mixpoll - updates the output buffer
  1563                                  ;--------------------------------------------------------------------------
  1564                                  ;
  1565                                  ;--------------------------------------------------------------------------
  1566                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1567                                  ;  In:
  1568                                  ;    Buffer  - Buffer Address.
  1569                                  ;    Count   - Buffer Size.
  1570                                  ;--------------------------------------------------------------------------
  1571                                  
  1572                                  mixpoll:
  1573                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1574                                  	; edi = buffer address
  1575                                  	; ebx = count
  1576                                  
  1577 000009D2 60                      	pushad
  1578                                  
  1579                                  	;cld
  1580                                  NextChunk:      
  1581 000009D3 66833D[96D70000]00      	cmp     word [BufLen], 0
  1582 000009DB 756A                    	jne     short CopyChunk
  1583                                  
  1584 000009DD 53                      	push    ebx
  1585 000009DE 57                      	push    edi
  1586                                  MixChunk:       
  1587 000009DF BF[8AB70000]            	mov	edi, MixBuffer
  1588                                  
  1589                                  	; 17/10/2017
  1590 000009E4 0FB70D[90D70000]        	movzx	ecx, word [BpmSamples]
  1591                                  	;mov	cx, [BpmSamples]
  1592 000009EB 893D[92D70000]          	mov     [BufPtr], edi
  1593 000009F1 66890D[96D70000]        	mov	[BufLen], cx
  1594                                  
  1595 000009F8 803D[BA540000]04        	cmp	byte [numtracks], 4
  1596 000009FF 7602                    	jna	short ch_silence
  1597                                  	;shl	cx, 1
  1598                                  	; 27/11/2023
  1599 00000A01 D1E1                    	shl	ecx, 1 
  1600                                  ch_silence:
  1601 00000A03 B880808080              	mov	eax, 80808080h
  1602 00000A08 F3AB                    	rep	stosd
  1603                                  
  1604                                  	;mov	cx, NumTracks
  1605                                  	;mov	cl, NumTracks ; 01/10/2017
  1606 00000A0A 8A0D[BA540000]          	mov	cl, [numtracks] ; 06/10/2017
  1607 00000A10 BE[7AD70000]            	mov	esi, Tracks - TrackInfo.size
  1608                                  GetSamples_next:
  1609 00000A15 51                      	push	ecx
  1610 00000A16 83C626                  	add	esi, TrackInfo.size
  1611 00000A19 668B0D[96D70000]        	mov	cx, [BufLen]
  1612 00000A20 8B3D[92D70000]          	mov	edi, [BufPtr]
  1613 00000A26 E8EDFEFFFF              	call	MixTrack
  1614 00000A2B 59                      	pop	ecx
  1615 00000A2C FF05[92D70000]          	inc	dword [BufPtr] ; 18/10/2017
  1616 00000A32 E2E1                    	loop	GetSamples_next
  1617                                  
  1618                                   	; 18/10/2017	
  1619 00000A34 8B1D[BA540000]          	mov	ebx, [numtracks]
  1620 00000A3A 291D[92D70000]          	sub	dword [BufPtr], ebx
  1621                                  
  1622 00000A40 E80FFEFFFF              	call    UpdateTracks
  1623                                  
  1624 00000A45 5F                      	pop     edi
  1625 00000A46 5B                      	pop     ebx
  1626                                  CopyChunk:      
  1627                                  	;mov	cx, [BufLen]
  1628 00000A47 0FB70D[96D70000]        	movzx	ecx, word [BufLen]
  1629 00000A4E 39D9                    	cmp	ecx, ebx
  1630                                  	;cmp	cx, bx
  1631 00000A50 7602                    	jbe     short MoveChunk
  1632                                  	;mov	cx, bx
  1633 00000A52 89D9                    	mov     ecx, ebx
  1634                                  MoveChunk:
  1635 00000A54 8B35[92D70000]          	mov     esi, [BufPtr]
  1636 00000A5A 010D[92D70000]          	add     [BufPtr], ecx
  1637 00000A60 66290D[96D70000]        	sub     [BufLen], cx
  1638 00000A67 29CB                    	sub     ebx, ecx
  1639                                  	; 17/10/2017 ; STEREO MIXING
  1640                                  	;rep	movsb
  1641                                  	; 18/10/2017
  1642 00000A69 803D[BA540000]04        	cmp	byte [numtracks], 4
  1643 00000A70 762F                    	jna	short _4_channels_mix ; 27/11/2023
  1644                                  	
  1645                                  _8_channels_mix:
  1646                                  	; 18/10/2017
  1647 00000A72 AD                      	lodsd 
  1648 00000A73 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1649 00000A75 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1650 00000A78 00C6                    	add	dh, al ; ch1 + ch4
  1651 00000A7A 00E2                    	add	dl, ah ; ch2 + ch3
  1652                                  
  1653 00000A7C AD                      	lodsd
  1654 00000A7D 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1655 00000A7F 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1656 00000A81 C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1657                                  	; 19/10/2017
  1658 00000A84 00E6                    	add	dh, ah ; ch1 + ch4 + ch5 + ch8
  1659 00000A86 00C2                    	add	dl, al ; ch2 + ch3 + ch6 + ch7
  1660                                  
  1661                                  	; L = ch1 + ch4 + ch5 + ch8
  1662                                  	; R = ch2 + ch3 + ch6 + ch7
  1663                                  
  1664 00000A88 6681C28080              	add	dx, 8080h
  1665                                  
  1666                                  	; 19/10/2017
  1667 00000A8D 88F4                    	mov	ah, dh
  1668 00000A8F 80EC80                  	sub	ah, 80h
  1669 00000A92 30C0                    	xor	al, al
  1670 00000A94 66AB                    	stosw ; Left Channel
  1671 00000A96 88D4                    	mov	ah, dl
  1672 00000A98 80EC80                  	sub	ah, 80h
  1673 00000A9B 66AB                    	stosw ; Right Channel
  1674                                  
  1675 00000A9D E2D3                    	loop	_8_channels_mix
  1676                                  	
  1677 00000A9F EB21                    	jmp	short channel_mix_ok
  1678                                  	
  1679                                  _4_channels_mix:
  1680                                  	; 18/10/2017
  1681 00000AA1 AD                      	lodsd 
  1682 00000AA2 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1683                                  	; 19/10/2017
  1684 00000AA4 C1E810                  	shr	eax, 16 ; ch3 (al), ch4 (ah)
  1685 00000AA7 00E2                    	add	dl, ah ; ch1 + ch4
  1686 00000AA9 00C6                    	add	dh, al ; ch2 + ch3
  1687                                  
  1688                                  	; L = ch1 + ch4
  1689                                  	; R = ch2 + ch3
  1690                                  
  1691                                  	; 19/10/2017
  1692 00000AAB 6681C28080              	add	dx, 8080h
  1693                                  
  1694                                  	; 19/10/2017
  1695 00000AB0 88D4                    	mov	ah, dl
  1696 00000AB2 80EC80                  	sub	ah, 80h
  1697 00000AB5 30C0                    	xor	al, al
  1698 00000AB7 66AB                    	stosw ; Left Channel
  1699 00000AB9 88F4                    	mov	ah, dh
  1700 00000ABB 80EC80                  	sub	ah, 80h
  1701 00000ABE 66AB                    	stosw ; Right Channel
  1702                                  	
  1703 00000AC0 E2DF                    	loop	_4_channels_mix
  1704                                  
  1705                                  channel_mix_ok:
  1706 00000AC2 85DB                    	test    ebx, ebx
  1707                                  	;jnz	short NextChunk
  1708 00000AC4 0F8509FFFFFF            	jnz	NextChunk ; 17/10/2017
  1709                                  
  1710                                  	; 20/10/2017
  1711                                  	; 19/10/2017
  1712                                  	; Pan Control
  1713 00000ACA 8A0D[24E30000]          	mov	cl, [pan_shift]
  1714 00000AD0 08C9                    	or	cl, cl
  1715 00000AD2 744D                    	jz	short c_smpl_2
  1716                                  
  1717                                  	; 20/10/2017
  1718 00000AD4 BB00400000              	mov	ebx, BUFFERSIZE/4 ; 8192
  1719 00000AD9 BF[00F00000]            	mov	edi, Audio_Buffer
  1720                                  
  1721 00000ADE B508                    	mov	ch, 8
  1722 00000AE0 D2E5                    	shl	ch, cl
  1723                                  c_smpl_1:
  1724 00000AE2 8B17                    	mov	edx, [edi]
  1725 00000AE4 6689D0                  	mov	ax, dx
  1726 00000AE7 80FC80                  	cmp	ah, 80h
  1727 00000AEA 7208                    	jb	short _cs1	
  1728 00000AEC 00EC                    	add	ah, ch
  1729 00000AEE 730A                    	jnc	short _cs2
  1730 00000AF0 B4FF                    	mov	ah, 255
  1731 00000AF2 EB06                    	jmp	short _cs2
  1732                                  _cs1:
  1733 00000AF4 28EC                    	sub	ah, ch
  1734 00000AF6 7302                    	jnc	short _cs2
  1735 00000AF8 B400                    	mov	ah, 0
  1736                                  _cs2:
  1737 00000AFA C1CA10                  	ror	edx, 16 ; dx = [edi+2]
  1738 00000AFD 00F4                    	add	ah, dh
  1739 00000AFF 6692                    	xchg	dx, ax ; xchg [edi+2], ax
  1740 00000B01 80FC80                  	cmp	ah, 80h
  1741 00000B04 7208                    	jb	short _cs3	
  1742 00000B06 00EC                    	add	ah, ch
  1743 00000B08 730A                    	jnc	short _cs4
  1744 00000B0A B4FF                    	mov	ah, 255
  1745 00000B0C EB06                    	jmp	short _cs4
  1746                                  _cs3:
  1747 00000B0E 28EC                    	sub	ah, ch
  1748 00000B10 7302                    	jnc	short _cs4
  1749 00000B12 B400                    	mov	ah, 0
  1750                                  _cs4:
  1751 00000B14 C1CA10                  	ror	edx, 16 ; dx = [edi]
  1752 00000B17 00E6                    	add	dh, ah
  1753 00000B19 8917                    	mov	[edi], edx
  1754                                  _cs5:
  1755                                  	; 20/10/2017
  1756 00000B1B 83C704                  	add	edi, 4
  1757 00000B1E 4B                      	dec	ebx
  1758 00000B1F 75C1                    	jnz	short c_smpl_1	
  1759                                  c_smpl_2:
  1760 00000B21 61                      	popad	
  1761 00000B22 C3                      	retn
  1762                                  
  1763                                  ;--------------------------------------------------------------------------
  1764                                  ; StartPlaying: Initializes the Sound System.
  1765                                  ;  In:
  1766                                  ;   Module Information Resources.
  1767                                  ;--------------------------------------------------------------------------
  1768                                  
  1769                                  StartPlaying:
  1770 00000B23 60                      	pushad
  1771                                  SetModParms:    
  1772 00000B24 C605[8AD70000]00        	mov     byte [OrderPos], 0
  1773 00000B2B C605[8BD70000]06        	mov     byte [Tempo], DefTempo
  1774 00000B32 C605[8CD70000]06        	mov     byte [TempoWait], DefTempo
  1775 00000B39 C605[8DD70000]7D        	mov     byte [Bpm], DefBpm
  1776 00000B40 C605[8ED70000]40        	mov     byte [Row], 64
  1777 00000B47 C605[8FD70000]00        	mov     byte [BreakRow], 0
  1778 00000B4E 66A1[C0540000]          	mov     ax, [MixSpeed]
  1779 00000B54 31D2                    	xor     edx, edx
  1780 00000B56 66BB3200                	mov     bx, 24*DefBpm/60
  1781 00000B5A 66F7F3                  	div     bx
  1782 00000B5D 66A3[90D70000]          	mov     [BpmSamples], ax
  1783                                  ClearTracks:    
  1784 00000B63 BF[A0D70000]            	mov     edi, Tracks
  1785                                  	; 07/10/2017
  1786                                  	;mov	ecx, NumTracks*TrackInfo.size
  1787 00000B68 B826000000              	mov	eax, TrackInfo.size
  1788 00000B6D 0FB70D[BA540000]        	movzx	ecx, word [numtracks]
  1789 00000B74 F7E1                    	mul	ecx
  1790 00000B76 89C1                    	mov	ecx, eax
  1791 00000B78 31C0                    	xor     eax, eax
  1792                                  	;cld
  1793 00000B7A F3AA                    	rep     stosb
  1794                                  
  1795 00000B7C A3[92D70000]            	mov     [BufPtr], eax
  1796 00000B81 66A3[96D70000]          	mov     [BufLen], ax
  1797                                  MakePitch:
  1798 00000B87 66B80021                	mov     ax, MidCRate
  1799 00000B8B 66BBAC01                	mov     bx, 428
  1800 00000B8F 66F7E3                  	mul     bx
  1801 00000B92 66F735[C0540000]        	div     word [MixSpeed]
  1802 00000B99 30F6                    	xor     dh, dh
  1803 00000B9B 88E2                    	mov     dl, ah
  1804 00000B9D 88C4                    	mov     ah, al
  1805 00000B9F 30C0                    	xor     al, al
  1806                                  	;mov	cx, 857
  1807 00000BA1 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1808 00000BA5 31DB                    	xor     ebx, ebx
  1809 00000BA7 BF[C85B0000]            	mov     edi, PitchTable
  1810                                  PitchLoop:      
  1811 00000BAC 50                      	push    eax
  1812 00000BAD 52                      	push    edx
  1813 00000BAE 6639DA                  	cmp     dx, bx
  1814 00000BB1 7303                    	jae     short NoDiv
  1815 00000BB3 66F7F3                  	div     bx
  1816                                  NoDiv:          
  1817 00000BB6 66AB                    	stosw
  1818 00000BB8 5A                      	pop     edx
  1819 00000BB9 58                      	pop     eax
  1820                                  	;inc	bx
  1821 00000BBA 43                      	inc	ebx
  1822 00000BBB E2EF                    	loop    PitchLoop
  1823                                  MakeVolume:     
  1824 00000BBD 66B90041                	mov     cx, 16640
  1825 00000BC1 89CB                    	mov     ebx, ecx
  1826                                  VolLoop:
  1827                                  	;dec	bx
  1828                                  	; 27/11/2023
  1829 00000BC3 4B                      	dec	ebx
  1830 00000BC4 88D8                    	mov     al, bl
  1831 00000BC6 F6EF                    	imul    bh
  1832                                  	;mov	[VolTable+bx], ah
  1833 00000BC8 88A3[8A760000]          	mov     [VolTable+ebx], ah
  1834 00000BCE E2F3                    	loop    VolLoop
  1835                                  
  1836 00000BD0 61                      	popad
  1837 00000BD1 C3                      	retn
  1838                                  
  1839                                  ;--------------------------------------------------------------------------
  1840                                  ; StopPlaying: ShutDown the Sound System.
  1841                                  ;--------------------------------------------------------------------------
  1842                                  
  1843                                  StopPlaying:
  1844                                  	; 19/06/2017
  1845                                  	; Stop Playing
  1846                                  	sys	_audio, 0700h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BD2 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 00000BD7 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BDC CD40                <1>  int 40h
  1847                                  	; Cancel callback service (for user)
  1848                                  	sys	_audio, 0900h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BDE 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 00000BE3 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BE8 CD40                <1>  int 40h
  1849                                  	; Deallocate Audio Buffer (for user)
  1850                                  	sys	_audio, 0A00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BEA 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 00000BEF B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BF4 CD40                <1>  int 40h
  1851                                  	; Disable Audio Device
  1852                                  	sys	_audio, 0C00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BF6 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 00000BFB B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000C00 CD40                <1>  int 40h
  1853                                  
  1854 00000C02 C3                      	retn
  1855                                  
  1856                                  ;=============================================================================
  1857                                  ; 
  1858                                  ;=============================================================================
  1859                                  
  1860                                  ;dword2str:
  1861                                  ;	; 13/11/2016 - Erdogan Tan 
  1862                                  ;	; eax = dword value
  1863                                  ;	;
  1864                                  ;	call	dwordtohex
  1865                                  ;	mov	[dword_str], edx
  1866                                  ;	mov	[dword_str+4], eax
  1867                                  ;	mov	si, dword_str
  1868                                  ;	retn
  1869                                  
  1870                                  	; 05/03/2017 (TRDOS 386)
  1871                                  	; trdos386.s (unix386.s) - 10/05/2015
  1872                                  	; Convert binary number to hexadecimal string
  1873                                  
  1874                                  ;bytetohex:
  1875                                  ;	; INPUT ->
  1876                                  ;	; 	AL = byte (binary number)
  1877                                  ;	; OUTPUT ->
  1878                                  ;	;	AX = hexadecimal string
  1879                                  ;	;
  1880                                  ;	push	ebx
  1881                                  ;	movzx	ebx, al
  1882                                  ;	shr	bl, 4
  1883                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1884                                  ;	xchg	bl, al
  1885                                  ;	and	bl, 0Fh
  1886                                  ;	mov	ah, [ebx+hex_chars] 
  1887                                  ;	pop	ebx	
  1888                                  ;	retn
  1889                                  
  1890                                  ;wordtohex:
  1891                                  ;	; INPUT ->
  1892                                  ;	; 	AX = word (binary number)
  1893                                  ;	; OUTPUT ->
  1894                                  ;	;	EAX = hexadecimal string
  1895                                  ;	;
  1896                                  ;	push	ebx
  1897                                  ;	xor	ebx, ebx
  1898                                  ;	xchg	ah, al
  1899                                  ;	push	eax
  1900                                  ;	mov	bl, ah
  1901                                  ;	shr	bl, 4
  1902                                  ;	mov	al, [ebx+hex_chars] 	 	
  1903                                  ;	mov	bl, ah
  1904                                  ;	and	bl, 0Fh
  1905                                  ;	mov	ah, [ebx+hex_chars]
  1906                                  ;	shl	eax, 16
  1907                                  ;	pop	eax
  1908                                  ;	pop	ebx
  1909                                  ;	jmp	short bytetohex
  1910                                  
  1911                                  ;dwordtohex:
  1912                                  ;	; INPUT ->
  1913                                  ;	; 	EAX = dword (binary number)
  1914                                  ;	; OUTPUT ->
  1915                                  ;	;	EDX:EAX = hexadecimal string
  1916                                  ;	;
  1917                                  ;	push	eax
  1918                                  ;	shr	eax, 16
  1919                                  ;	call	wordtohex
  1920                                  ;	mov	edx, eax
  1921                                  ;	pop	eax
  1922                                  ;	call	wordtohex
  1923                                  ;	retn
  1924                                  
  1925                                  	; 04/06/2024 (BugFix)
  1926                                  	; 24/06/2017
  1927                                  	; 19/06/2017
  1928                                  	; 05/03/2017 (TRDOS 386)
  1929                                  	; 13/11/2016 - Erdogan Tan
  1930                                  write_audio_dev_info:
  1931                                  	; BUS/DEV/FN
  1932                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1933                                  	; DEV/VENDOR
  1934                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1935                                  
  1936                                  	;mov	esi, [dev_vendor]
  1937                                  	; 04/06/2024
  1938 00000C03 A1[7C550000]            	mov	eax, [dev_vendor]
  1939 00000C08 0FB6D8                  	movzx	ebx, al
  1940 00000C0B 88DA                    	mov	dl, bl
  1941 00000C0D 80E30F                  	and	bl, 0Fh
  1942 00000C10 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1943 00000C16 A2[07550000]            	mov	[msgVendorId+3], al
  1944 00000C1B 88D3                    	mov	bl, dl
  1945 00000C1D C0EB04                  	shr	bl, 4
  1946 00000C20 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1947 00000C26 A2[06550000]            	mov	[msgVendorId+2], al
  1948 00000C2B 88E3                    	mov	bl, ah
  1949 00000C2D 88DA                    	mov	dl, bl
  1950 00000C2F 80E30F                  	and	bl, 0Fh
  1951 00000C32 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1952 00000C38 A2[05550000]            	mov	[msgVendorId+1], al
  1953 00000C3D 88D3                    	mov	bl, dl
  1954 00000C3F C0EB04                  	shr	bl, 4
  1955 00000C42 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1956 00000C48 A2[04550000]            	mov	[msgVendorId], al
  1957                                  	;shr	esi, 16
  1958                                  	; 04/06/2024
  1959 00000C4D C1E810                  	shr	eax, 16
  1960 00000C50 88C3                    	mov	bl, al
  1961 00000C52 88DA                    	mov	dl, bl
  1962 00000C54 80E30F                  	and	bl, 0Fh
  1963 00000C57 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1964 00000C5D A2[18550000]            	mov	[msgDevId+3], al
  1965 00000C62 88D3                    	mov	bl, dl
  1966 00000C64 C0EB04                  	shr	bl, 4
  1967 00000C67 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1968 00000C6D A2[17550000]            	mov	[msgDevId+2], al
  1969 00000C72 88E3                    	mov	bl, ah
  1970 00000C74 88DA                    	mov	dl, bl
  1971 00000C76 80E30F                  	and	bl, 0Fh
  1972 00000C79 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1973 00000C7F A2[16550000]            	mov	[msgDevId+1], al
  1974 00000C84 88D3                    	mov	bl, dl
  1975 00000C86 C0EB04                  	shr	bl, 4
  1976 00000C89 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1977 00000C8F A2[15550000]            	mov	[msgDevId], al
  1978                                  
  1979                                  	;mov	esi, [bus_dev_fn]
  1980                                  	;shr	esi, 8
  1981                                  	;mov	ax, si
  1982                                  	; 04/06/2024
  1983 00000C94 A1[80550000]            	mov	eax, [bus_dev_fn]
  1984 00000C99 C1E808                  	shr	eax, 8
  1985 00000C9C 88C3                    	mov	bl, al
  1986 00000C9E 88DA                    	mov	dl, bl
  1987 00000CA0 80E307                  	and	bl, 7 ; bit 0,1,2
  1988 00000CA3 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1989 00000CA9 A2[3C550000]            	mov	[msgFncNo+1], al
  1990 00000CAE 88D3                    	mov	bl, dl
  1991 00000CB0 C0EB03                  	shr	bl, 3
  1992 00000CB3 88DA                    	mov	dl, bl
  1993 00000CB5 80E30F                  	and	bl, 0Fh
  1994 00000CB8 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1995 00000CBE A2[2E550000]            	mov	[msgDevNo+1], al
  1996 00000CC3 88D3                    	mov	bl, dl
  1997 00000CC5 C0EB04                  	shr	bl, 4
  1998 00000CC8 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  1999 00000CCE A2[2D550000]            	mov	[msgDevNo], al
  2000 00000CD3 88E3                    	mov	bl, ah
  2001 00000CD5 88DA                    	mov	dl, bl
  2002 00000CD7 80E30F                  	and	bl, 0Fh
  2003 00000CDA 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2004 00000CE0 A2[22550000]            	mov	[msgBusNo+1], al
  2005 00000CE5 88D3                    	mov	bl, dl
  2006 00000CE7 C0EB04                  	shr	bl, 4
  2007 00000CEA 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2008 00000CF0 A2[21550000]            	mov	[msgBusNo], al
  2009                                  
  2010                                  	; 24/06/2017
  2011 00000CF5 66A1[88550000]          	mov	ax, [ac97_NamBar]
  2012 00000CFB 88C3                    	mov	bl, al
  2013 00000CFD 88DA                    	mov	dl, bl
  2014 00000CFF 80E30F                  	and	bl, 0Fh
  2015 00000D02 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2016 00000D08 A2[4B550000]            	mov	[msgNamBar+3], al
  2017 00000D0D 88D3                    	mov	bl, dl
  2018 00000D0F C0EB04                  	shr	bl, 4
  2019 00000D12 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2020 00000D18 A2[4A550000]            	mov	[msgNamBar+2], al
  2021 00000D1D 88E3                    	mov	bl, ah
  2022 00000D1F 88DA                    	mov	dl, bl
  2023 00000D21 80E30F                  	and	bl, 0Fh
  2024 00000D24 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2025 00000D2A A2[49550000]            	mov	[msgNamBar+1], al
  2026 00000D2F 88D3                    	mov	bl, dl
  2027 00000D31 C0EB04                  	shr	bl, 4
  2028 00000D34 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2029 00000D3A A2[48550000]            	mov	[msgNamBar], al
  2030                                  
  2031 00000D3F 66A1[8A550000]          	mov	ax, [ac97_NabmBar]
  2032 00000D45 88C3                    	mov	bl, al
  2033 00000D47 88DA                    	mov	dl, bl
  2034 00000D49 80E30F                  	and	bl, 0Fh
  2035 00000D4C 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2036 00000D52 A2[5B550000]            	mov	[msgNabmBar+3], al
  2037 00000D57 88D3                    	mov	bl, dl
  2038 00000D59 C0EB04                  	shr	bl, 4
  2039 00000D5C 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2040 00000D62 A2[5A550000]            	mov	[msgNabmBar+2], al
  2041 00000D67 88E3                    	mov	bl, ah
  2042 00000D69 88DA                    	mov	dl, bl
  2043 00000D6B 80E30F                  	and	bl, 0Fh
  2044 00000D6E 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2045 00000D74 A2[59550000]            	mov	[msgNabmBar+1], al
  2046 00000D79 88D3                    	mov	bl, dl
  2047 00000D7B C0EB04                  	shr	bl, 4
  2048 00000D7E 8A83[C2540000]          	mov	al, [ebx+hex_chars]
  2049 00000D84 A2[58550000]            	mov	[msgNabmBar], al
  2050                                  
  2051                                  	; 24/11/2016
  2052 00000D89 30E4                    	xor	ah, ah
  2053 00000D8B A0[8C550000]            	mov	al, [ac97_int_ln_reg]
  2054 00000D90 B10A                    	mov	cl, 10
  2055 00000D92 F6F1                    	div	cl
  2056 00000D94 660105[64550000]        	add	[msgIRQ], ax
  2057 00000D9B 20C0                    	and	al, al
  2058 00000D9D 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  2059 00000D9F A0[65550000]            	mov	al, [msgIRQ+1]
  2060 00000DA4 B420                    	mov	ah, ' '
  2061 00000DA6 66A3[64550000]          	mov	[msgIRQ], ax
  2062                                  _w_ac97imsg_:
  2063                                  	; EBX = Message address
  2064                                  	; ECX = Max. message length (or stop on ZERO character)
  2065                                  	;	(1 to 255)
  2066                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  2067                                       	sys 	_msg, msgAC97Info, 255, 07h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000DAC BB[D3540000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000DB1 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000DB6 BA07000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000DBB B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000DC0 CD40                <1>  int 40h
  2068 00000DC2 C3                              retn
  2069                                  
  2070                                  ;=============================================================================
  2071                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
  2072                                  ;=============================================================================
  2073                                  
  2074                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2075                                  
  2076                                  ;-----------------------------------------------------------------------------
  2077                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
  2078                                  ;-----------------------------------------------------------------------------
  2079                                  	; 22/10/2017
  2080                                  setgraphmode:
  2081                                  	;pushad
  2082 00000DC3 66B81200                	mov	ax,0012h
  2083                                  	;int	10h
  2084 00000DC7 CD31                    	int 	31h
  2085 00000DC9 66BAC003                	mov	dx,3C0h
  2086 00000DCD 30C0                    	xor	al,al
  2087                                  setgraphmodel0:
  2088                                  	;out	dx,al
  2089 00000DCF B401                    	mov	ah,1 ; outb
  2090 00000DD1 CD34                    	int	34h
  2091                                  	;out	dx,al
  2092                                  	;mov	ah,1
  2093 00000DD3 CD34                    	int	34h
  2094 00000DD5 FEC0                    	inc	al
  2095 00000DD7 3C10                    	cmp	al,10h
  2096 00000DD9 72F4                    	jb	short setgraphmodel0
  2097 00000DDB B020                    	mov	al,20h
  2098                                  	;out	dx,al
  2099                                  	;mov	ah,1
  2100 00000DDD CD34                    	int	34h
  2101                                  	;popad
  2102 00000DDF C3                      	retn
  2103                                  
  2104                                  ;-----------------------------------------------------------------------------
  2105                                  ; settextmode - restore the VGA 80x25x16 text mode
  2106                                  ;-----------------------------------------------------------------------------
  2107                                  	; 22/10/2017
  2108                                  settextmode:
  2109                                  	;pushad
  2110 00000DE0 66B80300                	mov	ax, 0003h
  2111                                  	;int	10h
  2112 00000DE4 CD31                    	int	31h
  2113                                  	;popad
  2114 00000DE6 C3                      	retn
  2115                                  
  2116                                  ;-----------------------------------------------------------------------------
  2117                                  ; drawscopes - draw the track voices sample scopes
  2118                                  ; In:
  2119                                  ;  ESI = (current) sample buffer
  2120                                  ;-----------------------------------------------------------------------------
  2121                                  	; 27/11/2023
  2122                                  	; 29/10/2017
  2123                                  	; 28/10/2017
  2124                                  	; (ESI = Current DMA buffer offset)
  2125                                  	; 27/10/2017
  2126                                  	; 26/10/2017
  2127                                  	; 23/10/2017
  2128                                  drawscopes:
  2129                                  	;pushad
  2130                                    	;mov	esi, g_buff
  2131                                  	;mov	esi, edx
  2132 00000DE7 31C9                    	xor     ecx, ecx	
  2133 00000DE9 31D2                    	xor     edx, edx
  2134 00000DEB 31FF                    	xor	edi, edi
  2135                                  drawscope0:
  2136 00000DED 66AD                    	lodsw
  2137 00000DEF 80F480                  	xor	ah, 80h
  2138 00000DF2 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  2139                                  	;shl	bx, 1
  2140                                  	; 27/11/2023
  2141 00000DF5 D1E3                    	shl	ebx, 1
  2142 00000DF7 668B83[D0D80000]        	mov	ax, [RowOfs+ebx]
  2143 00000DFE 668987[D0DA0000]        	mov	[NewScope_L+edi], ax
  2144 00000E05 30FF                    	xor	bh, bh
  2145 00000E07 66AD                    	lodsw
  2146 00000E09 80F480                  	xor	ah, 80h
  2147 00000E0C 88E3                    	mov	bl, ah	; Right Channel
  2148                                  	;shl	bx, 1
  2149                                  	; 27/11/2023
  2150 00000E0E D1E3                    	shl	ebx, 1
  2151 00000E10 668B83[D0D80000]        	mov	ax, [RowOfs+ebx]
  2152 00000E17 668987[D0DC0000]        	mov	[NewScope_R+edi], ax
  2153                                  	;add	di, 2
  2154                                  	; 27/11/2023
  2155 00000E1E 47                      	inc	edi
  2156 00000E1F 47                      	inc	edi
  2157 00000E20 FEC1                    	inc	cl
  2158 00000E22 75C9                    	jnz	short drawscope0	
  2159                                  
  2160 00000E24 66BAC403                        mov	dx, 3C4h
  2161                                          ;mov	ax, 0802h
  2162                                          ;out	dx, ax
  2163 00000E28 66BB0208                        mov	bx, 0802h
  2164 00000E2C B403                    	mov	ah, 3 ; outw
  2165 00000E2E CD34                    	int	34h
  2166                                  	;mov	dx, 3CEh
  2167                                  	; 27/11/2023 
  2168 00000E30 B2CE                            mov	dl, 0CEh
  2169 00000E32 B008                    	mov	al, 08h
  2170                                         ;out	dx, al
  2171 00000E34 B401                            mov	ah, 1 ; outb
  2172 00000E36 CD34                    	int	34h
  2173                                  	;inc	dx
  2174                                  	; 27/11/2023
  2175 00000E38 42                      	inc	edx
  2176                                  
  2177                                  	; 26/10/2017
  2178 00000E39 31F6                            xor	esi, esi
  2179                                         ;xor	edi, edi
  2180 00000E3B BB45060A00                      mov     ebx, 0A0645h
  2181                                  drawscopel4:
  2182 00000E40 B080                            mov     al, 80h
  2183                                  drawscopel2:
  2184 00000E42 50                              push    eax ; *
  2185 00000E43 52                              push    edx ; **
  2186                                  	;out	dx, al
  2187 00000E44 B401                    	mov	ah, 1 ; outb
  2188 00000E46 CD34                    	int	34h
  2189                                  
  2190 00000E48 B4FF                            mov	ah, 0FFh
  2191                                          ;mov	ecx, 32
  2192 00000E4A B120                    	mov	cl, 32
  2193 00000E4C 28C0                    	sub     al, al
  2194                                  drawscopel3:
  2195                                  	; 23/10/2017
  2196 00000E4E 668B96[D0DE0000]                mov	dx, [OldScope_L+esi]
  2197 00000E55 663B96[D0DA0000]                cmp	dx, [NewScope_L+esi]
  2198 00000E5C 7414                            je	short drawscopef3
  2199 00000E5E 88041A                          mov	[edx+ebx], al ; L
  2200 00000E61 668B96[D0DA0000]                mov     dx, [NewScope_L+esi]
  2201 00000E68 88241A                  	mov	[edx+ebx], ah ; L
  2202 00000E6B 668996[D0DE0000]                mov     [OldScope_L+esi], dx
  2203                                  drawscopef3:
  2204                                  	; 27/10/2017
  2205 00000E72 668B96[D0E00000]                mov	dx, [OldScope_R+esi]
  2206 00000E79 663B96[D0DC0000]                cmp	dx, [NewScope_R+esi]
  2207 00000E80 7416                            je	short drawscopef4
  2208 00000E82 88441A26                	mov	[edx+ebx+38], al ; R
  2209 00000E86 668B96[D0DC0000]                mov     dx, [NewScope_R+esi]
  2210 00000E8D 88641A26                        mov	[edx+ebx+38], ah ; R
  2211 00000E91 668996[D0E00000]                mov     [OldScope_R+esi], dx
  2212                                  drawscopef4:
  2213 00000E98 83C610                  	add	esi, 2*8
  2214 00000E9B 43                      	inc	ebx
  2215 00000E9C E2B0                    	loop    drawscopel3
  2216                                  
  2217 00000E9E 5A                              pop     edx ; **
  2218 00000E9F 58                              pop     eax ; *
  2219 00000EA0 81EEFE010000            	sub	esi, 2*256-2
  2220 00000EA6 83EB20                  	sub	ebx, 32
  2221 00000EA9 D0E8                            shr     al, 1
  2222 00000EAB 7595                            jnz	short drawscopel2
  2223                                  	;popad
  2224 00000EAD C3                              retn
  2225                                  
  2226                                  ;=============================================================================
  2227                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  2228                                  ;=============================================================================
  2229                                  
  2230                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2231                                  
  2232                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  2233                                  
  2234                                  ;-----------------------------------------------------------------------------
  2235                                  ; EQUATES AND STRUCTURES
  2236                                  ;-----------------------------------------------------------------------------
  2237                                  
  2238                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  2239                                  ID_ILBM equ 4D424C49h
  2240                                  ID_BMHD equ 44484D42h
  2241                                  ID_CMAP equ 50414D43h
  2242                                  ID_BODY equ 59444F42h
  2243                                  
  2244                                  struc Form			; IFF/ILBM header file format
  2245 00000000 ????????                  .ID:		resd 1
  2246 00000004 ????????                  .Length:	resd 1
  2247 00000008 ????????                  .Type:	resd 1
  2248                                    .size:
  2249                                  endstruc
  2250                                  
  2251                                  struc Chunk			; IFF/ILBM header chunk format
  2252 00000000 ????????                  .ID:		resd 1
  2253 00000004 ????????                  .Length:	resd 1
  2254                                    .size:	
  2255                                  endstruc
  2256                                  
  2257                                  struc BMHD			; IFF/ILBM BMHD chunk format
  2258 00000000 ????                      .Width: 	resw 1
  2259 00000002 ????                      .Height:	resw 1
  2260 00000004 ????                      .PosX:	resw 1
  2261 00000006 ????                      .PosY:	resw 1
  2262 00000008 ??                        .Planes:	resb 1
  2263 00000009 ??                        .Masking:	resb 1
  2264 0000000A ??                        .Compression:	resb 1
  2265 0000000B ??                        .Pad:		resb 1
  2266 0000000C ????                      .Transparent:	resw 1
  2267 0000000E ??                        .AspectX	resb 1
  2268 0000000F ??                        .AspectY:	resb 1
  2269 00000010 ????                      .PageWidth:	resw 1
  2270 00000012 ????                      .PageHeight:	resw 1
  2271                                    .size:	
  2272                                  endstruc
  2273                                  
  2274                                  struc CMAP			; IFF/ILBM CMAP chunk format
  2275 00000000 <res 300h>                .Colors:	resb 768
  2276                                    .size:	
  2277                                  endstruc
  2278                                  
  2279                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  2280                                  
  2281                                  ;------------------------------------------------------------------------------
  2282                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  2283                                  ;         a value in little/big endian form to big/little endian form.
  2284                                  ;------------------------------------------------------------------------------
  2285                                  %macro	bswap   1
  2286                                          xchg    al, ah
  2287                                          rol     eax, 16
  2288                                          xchg    al, ah
  2289                                  %endmacro
  2290                                  
  2291                                  ;------------------------------------------------------------------------------
  2292                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  2293                                  ; In:
  2294                                  ;  ESI = IFF/ILBM image file address
  2295                                  ;------------------------------------------------------------------------------
  2296                                  putlbm:
  2297 00000EAE 60                              pushad
  2298                                  
  2299                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  2300                                  
  2301 00000EAF 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  2302 00000EB5 7551                            jne     short putlbmd0
  2303 00000EB7 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  2304 00000EBE 7548                            jne     short putlbmd0
  2305                                  
  2306                                  ; get the IFF/ILBM file length in bytes
  2307                                  
  2308 00000EC0 8B4604                          mov     eax, [esi+Form.Length]
  2309                                          bswap   eax
  2286 00000EC3 86E0                <1>  xchg al, ah
  2287 00000EC5 C1C010              <1>  rol eax, 16
  2288 00000EC8 86E0                <1>  xchg al, ah
  2310 00000ECA 89C1                            mov     ecx, eax
  2311                                  
  2312                                  ; decrease the file length and updates the file pointer
  2313                                  
  2314 00000ECC 83E904                          sub     ecx, 4
  2315 00000ECF 83C60C                          add     esi, Form.size
  2316                                  
  2317                                  ; IFF/ILBM main parser body loop
  2318                                  
  2319                                  putlbml0:
  2320 00000ED2 85C9                            test    ecx, ecx
  2321 00000ED4 7E64                            jle     short putlbmd1
  2322                                  
  2323                                  ; get the next chunk ID and length in bytes
  2324                                  
  2325 00000ED6 8B1E                            mov     ebx, [esi+Chunk.ID]
  2326 00000ED8 8B4604                          mov     eax, [esi+Chunk.Length]
  2327                                          bswap   eax
  2286 00000EDB 86E0                <1>  xchg al, ah
  2287 00000EDD C1C010              <1>  rol eax, 16
  2288 00000EE0 86E0                <1>  xchg al, ah
  2328 00000EE2 93                              xchg    ebx, eax
  2329 00000EE3 83C608                          add     esi, Chunk.size
  2330                                  
  2331                                  ; word align the chunk length and decrease the file length counter
  2332                                  
  2333 00000EE6 43                              inc     ebx
  2334 00000EE7 80E3FE                          and     bl, 0FEh ; ~1
  2335 00000EEA 83E908                          sub     ecx, Chunk.size
  2336 00000EED 29D9                            sub     ecx, ebx
  2337                                  
  2338                                  ; check for the BMHD/CMAP/BODY chunk headers
  2339                                  
  2340 00000EEF 3D424D4844                      cmp     eax, ID_BMHD
  2341 00000EF4 7415                            je      short putlbmf0
  2342 00000EF6 3D434D4150                      cmp     eax, ID_CMAP
  2343 00000EFB 7440                            je      short putlbmf1
  2344 00000EFD 3D424F4459                      cmp     eax, ID_BODY
  2345 00000F02 7454                            je      short putlbmf2
  2346                                  
  2347                                  ; advance to the next IFF/ILBM chunk structure
  2348                                  
  2349                                  putlbmc0:
  2350 00000F04 01DE                            add     esi, ebx
  2351 00000F06 EBCA                            jmp     short putlbml0
  2352                                  
  2353                                  putlbmd0:
  2354 00000F08 F9                              stc
  2355 00000F09 61                              popad
  2356 00000F0A C3                              retn
  2357                                  
  2358                                  ; process the BMHD bitmap header chunk
  2359                                  
  2360                                  putlbmf0:
  2361 00000F0B 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  2362 00000F0F 75F7                            jne     short putlbmd0
  2363 00000F11 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  2364 00000F15 75F1                            jne     short putlbmd0
  2365 00000F17 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  2366 00000F1B 75EB                            jne     short putlbmd0
  2367 00000F1D 0FB706                          movzx   eax, word [esi+BMHD.Width]
  2368 00000F20 86E0                            xchg    al, ah
  2369 00000F22 83C007                          add     eax, 7
  2370 00000F25 C1E803                          shr     eax, 3
  2371 00000F28 A3[74550000]                    mov     [picture.width], eax
  2372 00000F2D 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  2373 00000F31 86E0                            xchg    al, ah
  2374 00000F33 A3[78550000]                    mov     [picture.height], eax
  2375 00000F38 EBCA                            jmp     short putlbmc0
  2376                                  
  2377                                  putlbmd1:
  2378 00000F3A F8                              clc
  2379 00000F3B 61                              popad
  2380 00000F3C C3                              retn
  2381                                  
  2382                                  ; process the CMAP colormap chunk
  2383                                  
  2384                                  putlbmf1:
  2385 00000F3D 66BAC803                        mov     dx, 3C8h
  2386 00000F41 30C0                            xor     al, al
  2387                                          ;out	dx, al
  2388 00000F43 B401                    	mov	ah, 1 ; outb
  2389 00000F45 CD34                    	int	34h
  2390                                          ;inc	dx
  2391                                  	; 27/11/2023
  2392 00000F47 42                      	inc	edx
  2393                                  putlbml1:
  2394 00000F48 8A06                            mov     al, [esi]
  2395 00000F4A C0E802                          shr     al, 2
  2396                                          ;out	dx, al
  2397                                  	;mov	ah, 1 ; outb
  2398 00000F4D CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2399 00000F4F 46                              inc     esi
  2400 00000F50 4B                              dec     ebx
  2401 00000F51 7FF5                            jg      short putlbml1
  2402 00000F53 E97AFFFFFF                      jmp     putlbml0
  2403                                  
  2404                                  ; process the BODY bitmap body chunk
  2405                                  
  2406                                  putlbmf2:
  2407 00000F58 60                              pushad
  2408 00000F59 BF00000A00                      mov     edi, 0A0000h
  2409                                          ;cld
  2410 00000F5E 66BACE03                        mov     dx, 3CEh
  2411                                          ;mov	ax, 0FF08h
  2412                                          ;out	dx, ax
  2413 00000F62 66BB08FF                	mov	bx, 0FF08h
  2414 00000F66 B403                    	mov	ah, 3 ; outw
  2415 00000F68 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2416                                  	;mov	dx, 3C4h
  2417                                  	; 27/11/2023
  2418 00000F6A B2C4                    	mov	dl, 0C4h
  2419 00000F6C B002                            mov     al, 02h
  2420                                          ;out	dx, al
  2421 00000F6E B401                    	mov	ah, 1 ; outb
  2422 00000F70 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2423                                  	;inc	dx
  2424                                  	; 27/11/2023
  2425 00000F72 42                      	inc	edx
  2426 00000F73 8B0D[78550000]                  mov     ecx, [picture.height]
  2427                                  putlbml2:
  2428 00000F79 51                              push    ecx
  2429 00000F7A B011                            mov     al, 11h
  2430                                  putlbml3:
  2431 00000F7C 50                              push    eax
  2432 00000F7D 57                              push    edi
  2433                                          ;out	dx, al
  2434 00000F7E B401                    	mov	ah, 1 ; outb
  2435 00000F80 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2436 00000F82 8B1D[74550000]                  mov     ebx, [picture.width]
  2437                                  putlbml4:
  2438 00000F88 AC                              lodsb
  2439 00000F89 84C0                            test    al, al
  2440 00000F8B 7C0A                            jl      short putlbmf3
  2441 00000F8D 0FB6C8                          movzx   ecx, al
  2442 00000F90 41                              inc     ecx
  2443 00000F91 29CB                            sub     ebx, ecx
  2444 00000F93 F3A4                            rep     movsb
  2445 00000F95 EB0B                            jmp     short putlbmc4
  2446                                  putlbmf3:
  2447 00000F97 F6D8                            neg     al
  2448 00000F99 0FB6C8                          movzx   ecx, al
  2449 00000F9C 41                              inc     ecx
  2450 00000F9D 29CB                            sub     ebx, ecx
  2451 00000F9F AC                              lodsb
  2452 00000FA0 F3AA                            rep     stosb
  2453                                  putlbmc4:
  2454 00000FA2 85DB                            test    ebx, ebx
  2455 00000FA4 7FE2                            jg      short putlbml4
  2456 00000FA6 5F                              pop     edi
  2457 00000FA7 58                              pop     eax
  2458 00000FA8 00C0                            add     al, al
  2459 00000FAA 73D0                            jnc     short putlbml3
  2460 00000FAC 83C750                          add     edi, 80
  2461 00000FAF 59                              pop     ecx
  2462 00000FB0 E2C7                            loop    putlbml2
  2463 00000FB2 61                      	popad
  2464 00000FB3 E94CFFFFFF                      jmp	putlbmc0
  2465                                  
  2466                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  2467                                  ;------------------------------------------------------------------------------
  2468                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  2469                                  ;  ESI = IFF/ILBM image file address
  2470                                  ;------------------------------------------------------------------------------
  2471                                  
  2472                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  2473                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  2474                                  ;       MODStopModule();
  2475                                  ;       MODFreeModule(Song);
  2476                                  ;       return;
  2477                                  ;   }
  2478                                  ;   setgraphmode();
  2479                                  ;   putlbm(Logo);
  2480                                  ;   while (!kbhit())
  2481                                  ;       drawscopes(Song->NumTracks);
  2482                                  ;   settextmode();
  2483                                  ;   free(Logo);
  2484                                  ;   MODStopModule();
  2485                                  ;   MODFreeModule(Song);
  2486                                  
  2487                                  ;loadlbm:
  2488                                  ;	; ebx = ASCIIZ file name address
  2489                                  ;	; ecx = open mode (0 = open for read)	
  2490                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  2491                                  ;	jc	short loadlbm_retn
  2492                                  ;
  2493                                  ;	mov     [LBM_FileHandle], eax
  2494                                  ;
  2495                                  ;	; get file size by moving file pointer to the end of file
  2496                                  ;	; ebx = file handle/number
  2497                                  ;	; ecx : offset = 0
  2498                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  2499                                  ;	sys	_seek, eax, 0, 2
  2500                                  ;	jc	short loadlbm_cf
  2501                                  ;
  2502                                  ;	mov	[LBM_FileSize], eax
  2503                                  ;
  2504                                  ;	; move file pointer to the beginning of the file
  2505                                  ;	; ecx = 0
  2506                                  ;	; edx = 0
  2507                                  ;	;xor	ecx, ecx
  2508                                  ; 	xor	dl, dl
  2509                                  ;	; ebx = [LBM_FileHandle]
  2510                                  ;	sys	_seek
  2511                                  ;	;jc	short loadlbm_cf
  2512                                  ;
  2513                                  ;	; ebx = File handle
  2514                                  ;	; ecx = Buffer address
  2515                                  ;	; edx = Byte count
  2516                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  2517                                  ;	mov	ecx, LOGO_ADDRESS
  2518                                  ;	mov	edx, [LBM_FileSize]
  2519                                  ;	sys	_read
  2520                                  ;	jc	short loadlbm_cf
  2521                                  ;
  2522                                  ;	cmp	eax, edx  ; read count = file size ?
  2523                                  ;	;jb	short loadlbm_cf		 
  2524                                  ;loadlbm_cf:
  2525                                  ;	pushf
  2526                                  ;	sys	_close, [LBM_FileHandle]	
  2527                                  ;	popf
  2528                                  ;loadlbm_retn:
  2529                                  ;	retn	
  2530                                  ;
  2531                                  ;LOGO_FILE_NAME:
  2532                                  ;	db	"LOGO.LBM", 0
  2533                                  
  2534                                  LOGO_ERROR_MSG:
  2535 00000FB8 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  2535 00000FC1 64696E672074686520-
  2535 00000FCA 4946462F494C424D20-
  2535 00000FD3 6C6F676F2070696374-
  2535 00000FDC 75726520210D0A00   
  2536                                  
  2537                                  align 2
  2538                                  ; 22/10/2017
  2539                                  LOGO_ADDRESS:
  2540                                  ;incbin "LOGO.LBM"	  	 
  2541                                  ; 27/10/2017
  2542 00000FE4 <bin 4298h>             incbin "TINYPLAY.LBM"
  2543                                  
  2544                                  ;=============================================================================
  2545                                  ;               preinitialized data
  2546                                  ;=============================================================================
  2547                                  
  2548                                  ;=============================================================================
  2549                                  ; Protracker effects stuff
  2550                                  ;=============================================================================
  2551                                  
  2552                                  ;-----------------------------------------------------------------------------
  2553                                  ; Effect jump tables
  2554                                  ;-----------------------------------------------------------------------------
  2555                                  
  2556                                  align 4
  2557                                  
  2558                                  efxtable:
  2559 0000527C [BE070000]              	dd      efxarpeggio	; 0 - arpeggio
  2560 00005280 [EC040000]              	dd      efxnull		; 1 - porta up
  2561 00005284 [EC040000]              	dd      efxnull		; 2 - porta down
  2562 00005288 [0A070000]              	dd      efxtoneporta	; 3 - tone porta
  2563 0000528C [19070000]              	dd      efxvibrato	; 4 - vibrato
  2564 00005290 [EC040000]              	dd      efxnull		; 5 - tone+slide
  2565 00005294 [EC040000]              	dd      efxnull		; 6 - vibrato+slide
  2566 00005298 [35080000]              	dd      efxtremolo	; 7 - tremolo
  2567 0000529C [EC040000]              	dd      efxnull		; 8 - unused
  2568 000052A0 [41070000]              	dd      efxsampoffset	; 9 - sample offset
  2569 000052A4 [EC040000]              	dd      efxnull		; A - volume slide
  2570 000052A8 [4D070000]              	dd      efxpattjump	; B - pattern jump
  2571 000052AC [5B070000]              	dd      efxsetvolume	; C - set volume
  2572 000052B0 [69070000]              	dd      efxbreak	; D - break pattern
  2573 000052B4 [EC040000]              	dd      efxnull		; E - extra effects
  2574 000052B8 [88070000]              	dd      efxsetspeed	; F - set speed
  2575                                  
  2576                                  efxtable2:
  2577 000052BC [ED040000]              	dd      efxarpeggio2	; 0 - arpeggio
  2578 000052C0 [0F050000]              	dd      efxportaup	; 1 - porta up
  2579 000052C4 [35050000]              	dd      efxportadown	; 2 - porta down
  2580 000052C8 [5C050000]              	dd      efxtoneporta2	; 3 - tone porta
  2581 000052CC [95050000]              	dd      efxvibrato2	; 4 - vibrato
  2582 000052D0 [F1050000]              	dd      efxtoneslide	; 5 - tone+slide
  2583 000052D4 [FE050000]              	dd      efxvibslide	; 6 - vibrato+slide
  2584 000052D8 [25060000]              	dd      efxtremolo2	; 7 - tremolo
  2585 000052DC [EC040000]              	dd      efxnull		; 8 - unused
  2586 000052E0 [EC040000]              	dd      efxnull		; 9 - sample offset
  2587 000052E4 [08060000]              	dd      efxvolslide	; A - volume slide
  2588 000052E8 [EC040000]              	dd      efxnull		; B - pattern jump
  2589 000052EC [EC040000]              	dd      efxnull		; C - set volume
  2590 000052F0 [EC040000]              	dd      efxnull		; D - break pattern
  2591 000052F4 [EC040000]              	dd      efxnull		; E - extra effects
  2592 000052F8 [EC040000]              	dd      efxnull		; F - set speed
  2593                                  
  2594                                  ;-----------------------------------------------------------------------------
  2595                                  ; Amiga period table
  2596                                  ;-----------------------------------------------------------------------------
  2597                                  
  2598                                  ;PeriodTable0:	
  2599                                  ;	dw	0
  2600                                  PeriodTable:
  2601 000052FC 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  2601 00005305 0A000A7009E8086808-
  2601 0000530E F00780071407       
  2602 00005314 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  2602 0000531D 050005B80474043404-
  2602 00005326 F803C0038A03       
  2603 0000532C 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  2603 00005335 0280025C023A021A02-
  2603 0000533E FC01E001C501       
  2604 00005344 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  2604 0000534D 0140012E011D010D01-
  2604 00005356 FE00F000E200       
  2605 0000535C D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  2605 00005365 00A00097008F008700-
  2605 0000536E 7F0078007100       
  2606 00005374 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  2606 0000537D 0050004B0047004300-
  2606 00005386 3F003C003800       
  2607 0000538C 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  2607 00005395 002800250023002100-
  2607 0000539E 1F001E001C00       
  2608                                  
  2609                                  ;-----------------------------------------------------------------------------
  2610                                  ; Sinus wave table
  2611                                  ;-----------------------------------------------------------------------------
  2612                                  
  2613                                  SinTable:
  2614 000053A4 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  2614 000053AD C5D4E1             
  2615 000053B0 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  2615 000053B9 E1                 
  2616 000053BA D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  2616 000053C3 19                 
  2617                                  
  2618                                  ;=============================================================================
  2619                                  ;               PLAY.ASM - DATA
  2620                                  ;=============================================================================
  2621 000053C4 00                      	db	0
  2622                                  msg_usage:
  2623 000053C5 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2623 000053CE 506C6179657220666F-
  2623 000053D7 72205452444F532033-
  2623 000053E0 383620627920457264-
  2623 000053E9 6F67616E2054616E2E-
  2623 000053F2 20                 
  2624                                  	;;;db	'October 2017.',10,13
  2625                                  	;;db	'November 2023.',10,13 ; 27/11/2023
  2626                                  	;db	'June 2024.',10,13
  2627 000053F3 446563656D62657220-     	db	'December 2024',10,13	
  2627 000053FC 323032340A0D       
  2628 00005402 75736167653A20746D-     	db	'usage: tmodplay filename.mod', 10,13,0
  2628 0000540B 6F64706C6179206669-
  2628 00005414 6C656E616D652E6D6F-
  2628 0000541D 640A0D00           
  2629 00005421 32392F31302F323031-     	db	'29/10/2017',10,13,0
  2629 0000542A 370A0D00           
  2630 0000542E 32372F31312F323032-     	db	'27/11/2023',10,13,0
  2630 00005437 330A0D00           
  2631                                  	;db	'02/06/2024',10,13,0
  2632                                  	;db	'04/06/2024',10,13,0
  2633 0000543B 32372F31322F323032-     	db	'27/12/2024',10,13,0
  2633 00005444 340A0D00           
  2634                                  
  2635                                  Credits:
  2636 00005448 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2636 00005451 506C61796572207630-
  2636 0000545A 2E3162206279204361-
  2636 00005463 726C6F732048617361-
  2636 0000546C 6E2E204A756C792031-
  2636 00005475 3939332E           
  2637 00005479 0A0D00                  	db	10,13,0
  2638                                  ErrorMesg:    
  2639 0000547C 4572726F72206C6F61-     	db 'Error loading Module file.',10,13,0
  2639 00005485 64696E67204D6F6475-
  2639 0000548E 6C652066696C652E0A-
  2639 00005497 0D00               
  2640                                  
  2641                                  ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0
  2642                                  ;MsgFound:    db 'Sound Blaster found at Address 2'
  2643                                  ;PortText:    db 'x0h, IRQ '
  2644                                  ;IrqText:     db 'x.',10,13,0
  2645                                  
  2646                                  trdos386_err_msg:
  2647 00005499 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  2647 000054A2 2053797374656D2063-
  2647 000054AB 616C6C206572726F72-
  2647 000054B4 20210A0D00         
  2648                                  
  2649                                  ; 07/10/2017
  2650 000054B9 0A                      pattern_shift:	db 10
  2651                                  ;numtracks:	dw 4
  2652                                  ; 18/10/2017
  2653 000054BA 04000000                numtracks:	dd 4
  2654                                  
  2655                                  ;=============================================================================
  2656                                  ;               PLAYER.ASM - DATA
  2657                                  ;=============================================================================
  2658                                  
  2659                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  2660                                  ;bps:		db 8 ; bits per sample (8 or 16)
  2661                                  
  2662                                  ;19/10/2017
  2663 000054BE 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  2664 000054BF 10                      bps:		db 16 ; bits per sample (8 or 16)
  2665                                  
  2666                                  Sample_Rate:
  2667                                  MixSpeed:	;dw 22050 ; Hz
  2668                                  		; 27/11/2023
  2669                                  		;dw 24000 ; Hz
  2670                                  		; 02/06/2024
  2671 000054C0 80BB                    		dw 48000  ; Hz		
  2672                                  
  2673                                  ; 13/11/2016
  2674 000054C2 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2674 000054CB 3941424344454600   
  2675                                  ;
  2676                                  msgAC97Info:	
  2677 000054D3 0D0A                    		db 0Dh, 0Ah
  2678 000054D5 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2678 000054DE 6F20436F6E74726F6C-
  2678 000054E7 6C6572202620436F64-
  2678 000054F0 656320496E666F0D0A 
  2679 000054F9 56656E646F72204944-     		db "Vendor ID: "
  2679 00005502 3A20               
  2680 00005504 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2680 0000550D 6963652049443A20   
  2681 00005515 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2682 0000551C 4275733A20              		db "Bus: "
  2683 00005521 303068204465766963-     msgBusNo:	db "00h Device: "
  2683 0000552A 653A20             
  2684 0000552D 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2684 00005536 696F6E3A20         
  2685 0000553B 303068                  msgFncNo	db "00h"
  2686 0000553E 0D0A                    		db 0Dh, 0Ah
  2687 00005540 4E414D4241523A20        		db "NAMBAR: "
  2688 00005548 30303030682020          msgNamBar	db "0000h  "
  2689 0000554F 4E41424D4241523A20      		db "NABMBAR: "
  2690 00005558 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  2690 00005561 513A20             
  2691 00005564 3030                    msgIRQ:		dw 3030h
  2692 00005566 0D0A00                  		db 0Dh, 0Ah, 0
  2693                                  ;
  2694                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2695                                  ;codec_id:	   dd 0
  2696                                  ;codec_chip_id:	   dd 0
  2697                                  ;codec_vendor_ids: dw 0
  2698                                  ;codec_chip_ids:   dw 0
  2699                                  
  2700                                  ;dword_str:	dd 30303030h, 30303030h
  2701                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2702                                  
  2703                                  ;=============================================================================
  2704                                  ;        	uninitialized data
  2705                                  ;=============================================================================
  2706                                  
  2707                                  bss_start:
  2708                                  
  2709                                  ABSOLUTE bss_start
  2710                                  
  2711 00005569 ??????                  alignb 4
  2712                                  
  2713                                  ;------------------------------------------------------------------------------
  2714                                  ; IFF/ILBM DATA
  2715                                  ;------------------------------------------------------------------------------
  2716                                  
  2717 0000556C ????????                LBM_FileHandle:	resd 1
  2718 00005570 ????????                LBM_FileSize:	resd 1
  2719                                  ;
  2720 00005574 ????????                picture.width:	resd 1 		; current picture width and height
  2721 00005578 ????????                picture.height:	resd 1
  2722                                  
  2723                                  ;------------------------------------------------------------------------------
  2724                                  
  2725 0000557C ????????                dev_vendor:	resd 1
  2726 00005580 ????????                bus_dev_fn:	resd 1
  2727 00005584 ????????                stats_cmd:	resd 1
  2728 00005588 ????                    ac97_NamBar:	resw 1
  2729 0000558A ????                    ac97_NabmBar:	resw 1
  2730 0000558C ??                      ac97_int_ln_reg: resb 1
  2731 0000558D ??                      srb:		resb 1
  2732                                  
  2733                                  ; MODLOAD.ASM
  2734 0000558E ????????                FileHandle:	resd 1
  2735 00005592 <res 43Ch>              Header:		resb ModHeader.size
  2736                                  
  2737                                  ; MODPLAY.ASM
  2738                                  ;MixSpeed:	    resw 1
  2739                                  
  2740                                  ModInfo:
  2741 000059CE ??                      ModInfo.OrderLen:   resb 1
  2742 000059CF ??                      ModInfo.ReStart:    resb 1
  2743 000059D0 <res 80h>               ModInfo.Order:	    resb 128
  2744 00005A50 ????????                ModInfo.Patterns:   resd 1
  2745                                  
  2746 00005A54 <res 3Eh>               ModInfo.SampOfs:    resw 31
  2747 00005A92 <res 3Eh>               ModInfo.SampSeg:    resw 31
  2748 00005AD0 <res 3Eh>               ModInfo.SampLen:    resw 31
  2749 00005B0E <res 3Eh>               ModInfo.SampRep:    resw 31
  2750 00005B4C <res 3Eh>               ModInfo.SampRepLen: resw 31
  2751 00005B8A <res 3Eh>               ModInfo.SampVol:    resw 31
  2752                                  
  2753                                  ; MODPLAY.ASM
  2754                                  PitchTable:	;resw 857
  2755 00005BC8 <res 1AC2h>             		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2756 0000768A <res 4100h>             VolTable:	resb 16640
  2757                                  MixBuffer:	;resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2758 0000B78A <res 2000h>             		resb 8192	
  2759                                  
  2760                                  ; MODPLAY.ASM
  2761 0000D78A ??                      OrderPos:	resb 1
  2762 0000D78B ??                      Tempo:		resb 1
  2763 0000D78C ??                      TempoWait:	resb 1
  2764 0000D78D ??                      Bpm:		resb 1
  2765 0000D78E ??                      Row:		resb 1
  2766 0000D78F ??                      BreakRow:	resb 1
  2767 0000D790 ????                    BpmSamples:	resw 1
  2768 0000D792 ????????                BufPtr:		resd 1
  2769 0000D796 ????                    BufLen:		resw 1
  2770 0000D798 ????????                BufRep:		resd 1
  2771 0000D79C ????????                Note:		resd 1
  2772                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2773                                  ; 07/10/2017
  2774 0000D7A0 <res 130h>              Tracks:		resb TrackInfo.size*8
  2775                                  
  2776                                  alignb 16
  2777                                  
  2778                                  ; PLAY.ASM
  2779                                  ;Scope:		resw 320
  2780 0000D8D0 <res 200h>              RowOfs:		resw 256
  2781                                  
  2782                                  ; 23/10/2017
  2783 0000DAD0 <res 200h>              NewScope_L:	resw 256
  2784 0000DCD0 <res 200h>              NewScope_R:	resw 256
  2785 0000DED0 <res 200h>              OldScope_L:	resw 256
  2786 0000E0D0 <res 200h>              OldScope_R:	resw 256
  2787                                  
  2788                                  ; 27/12/2024
  2789 0000E2D0 ????????                timerticks:	resd 1
  2790                                  
  2791                                  mod_file_name:
  2792 0000E2D4 <res 50h>               		resb 80
  2793                                  
  2794                                  ; 20/10/2017 (modplay7.s, SB16)
  2795                                  ; 19/10/2017 (modplay6.s, AC97)
  2796 0000E324 ??                      pan_shift:	resb 1
  2797 0000E325 ??                      volume_level:	resb 1
  2798                                  
  2799 0000E326 <res CDAh>              alignb 4096
  2800                                  
  2801                                  Audio_Buffer:
  2802 0000F000 <res 10000h>            		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2803                                  ;temp_buffer:
  2804                                  ;		;resb BUFFERSIZE / 4 ; 8192
  2805                                  ;		resb BUFFERSIZE / 2 ; 17/10/2017
  2806                                  
  2807 0001F000 <res 1000h>             alignb 65536
  2808                                  
  2809                                  DMA_Buffer:	;resb 65536
  2810 00020000 <res 20000h>            		resb 131072 ; 27/11/2023	
  2811                                  file_buffer:
  2812 00040000 <res 60000h>            		resb 65536*6
  2813                                  EOF:
