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