     1                                  ; ****************************************************************************
     2                                  ; modplay.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 24/06/2017
     7                                  ;
     8                                  ; [ Last Modification: 27/12/2024 ] ; modplayv.s (this file)
     9                                  ;                                   ; modified from modplayk.s (27/12/2024)
    10                                  ;
    11                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    12                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    13                                  ;
    14                                  ; Modified by using the source code of 'tinyplay.s' ('TINYPLAY.PRG')
    15                                  ; by Erdogan Tan (07/10/2017)
    16                                  ;
    17                                  ; Modified from 'playwav3.s' (13/06/2017)
    18                                  ;
    19                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    20                                  ;			                     (23/06/2017)
    21                                  ;
    22                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    23                                  ;				      (04/03/2017) 
    24                                  ; Assembler: NASM 2.15
    25                                  ; ----------------------------------------------------------------------------
    26                                  ;	   nasm  modplay.s -l modplay.txt -o MODPLAY.PRG
    27                                  ; ****************************************************************************
    28                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    29                                  
    30                                  ; 27/11/2024 (ref: vgaplay2.s, 27/12/2024)
    31                                  ; modplayv.s - display/graphics : VESA VBE Mode 101h, 640*480, 256 colors
    32                                  
    33                                  ; 01/03/2017
    34                                  ; 16/10/2016
    35                                  ; 29/04/2016
    36                                  ; TRDOS 386 system calls (temporary list!)
    37                                  _ver 	equ 0
    38                                  _exit 	equ 1
    39                                  _fork 	equ 2
    40                                  _read 	equ 3
    41                                  _write	equ 4
    42                                  _open	equ 5
    43                                  _close 	equ 6
    44                                  _wait 	equ 7
    45                                  _creat 	equ 8
    46                                  _link 	equ 9
    47                                  _unlink	equ 10
    48                                  _exec	equ 11
    49                                  _chdir	equ 12
    50                                  _time 	equ 13
    51                                  _mkdir 	equ 14
    52                                  _chmod	equ 15
    53                                  _chown	equ 16
    54                                  _break	equ 17
    55                                  _stat	equ 18
    56                                  _seek	equ 19
    57                                  _tell 	equ 20
    58                                  _mount	equ 21
    59                                  _umount	equ 22
    60                                  _setuid	equ 23
    61                                  _getuid	equ 24
    62                                  _stime	equ 25
    63                                  _quit	equ 26	
    64                                  _intr	equ 27
    65                                  _fstat	equ 28
    66                                  _emt 	equ 29
    67                                  _mdate 	equ 30
    68                                  _video 	equ 31
    69                                  _audio	equ 32
    70                                  _timer	equ 33
    71                                  _sleep	equ 34
    72                                  _msg    equ 35
    73                                  _geterr	equ 36
    74                                  _fpsave	equ 37
    75                                  _pri	equ 38
    76                                  _rele	equ 39
    77                                  _fff	equ 40
    78                                  _fnf	equ 41
    79                                  _alloc	equ 42
    80                                  _dalloc equ 43
    81                                  _calbac equ 44		
    82                                  
    83                                  %macro sys 1-4
    84                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    85                                      ; 03/09/2015	
    86                                      ; 13/04/2015
    87                                      ; Retro UNIX 386 v1 system call.	
    88                                      %if %0 >= 2   
    89                                          mov ebx, %2
    90                                          %if %0 >= 3    
    91                                              mov ecx, %3
    92                                              %if %0 = 4
    93                                                 mov edx, %4   
    94                                              %endif
    95                                          %endif
    96                                      %endif
    97                                      mov eax, %1
    98                                      ;int 30h
    99                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
   100                                  %endmacro
   101                                  
   102                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   103                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   104                                  
   105                                  ; 19/06/2017
   106                                  BUFFERSIZE equ 32768
   107                                  
   108                                  ; ----------------------------------------------------------------------------
   109                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   110                                  ;	July 14th, 1993.
   111                                  
   112                                  ;=============================================================================
   113                                  ;  
   114                                  ;=============================================================================
   115                                  
   116                                  [BITS 32]
   117                                  [org 0]
   118                                  
   119                                  Start:
   120                                  	; clear bss
   121 00000000 B9[00000800]            	mov	ecx, EOF
   122 00000005 BF[0E0F0000]            	mov	edi, bss_start
   123 0000000A 29F9                    	sub	ecx, edi
   124 0000000C D1E9                    	shr	ecx, 1
   125 0000000E 31C0                    	xor	eax, eax
   126 00000010 F366AB                  	rep	stosw
   127                                  
   128                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   129 00000013 E82E020000              	call    DetectICH
   130 00000018 731B                    	jnc     short GetFileName
   131                                  
   132                                  _dev_not_ready:
   133                                  ; couldn't find the audio device!
   134                                  	sys	_msg, noDevMsg, 255, 0Fh
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 0000001A BB[53020000]        <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 0000001F B9FF000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 00000024 BA0F000000          <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000029 B823000000          <1>  mov eax, %1
    98                              <1> 
    99 0000002E CD40                <1>  int 40h
   135 00000030 E9E9010000                      jmp     Exit
   136                                  
   137                                  GetFileName:  
   138 00000035 89E6                    	mov	esi, esp
   139 00000037 AD                      	lodsd
   140 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   141                                  		; (program file name & mod file name)
   142 0000003B 0F82E6010000            	jb	pmsg_2017 ; nothing to do
   143                                  
   144 00000041 AD                      	lodsd ; program file name address 
   145 00000042 AD                      	lodsd ; mod file name address (file to be read)
   146 00000043 89C6                    	mov	esi, eax
   147 00000045 BF[C87B0000]            	mov	edi, mod_file_name
   148                                  ScanName:       
   149 0000004A AC                      	lodsb
   150 0000004B 84C0                    	test	al, al
   151 0000004D 0F84D4010000            	je	pmsg_2017
   152 00000053 3C20                    	cmp	al, 20h
   153 00000055 74F3                    	je	short ScanName	; scan start of name.
   154 00000057 AA                      	stosb
   155 00000058 B4FF                    	mov	ah, 0FFh
   156                                  a_0:	
   157 0000005A FEC4                    	inc	ah
   158                                  a_1:
   159 0000005C AC                      	lodsb
   160 0000005D AA                      	stosb
   161 0000005E 3C2E                    	cmp	al, '.'
   162 00000060 74F8                    	je	short a_0	
   163 00000062 20C0                    	and	al, al
   164 00000064 75F6                    	jnz	short a_1
   165                                  
   166 00000066 08E4                    	or	ah, ah		; if period NOT found,
   167 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   168                                  SetExt:
   169 0000006A 4F                      	dec	edi
   170 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   171 00000071 C6470400                	mov	byte [edi+4], 0
   172                                  PrintMesg:      
   173                                  	; Prints the Credits Text.
   174                                  	sys	_msg, Credits, 255, 0Fh
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000075 BB[8A0D0000]        <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 0000007A B9FF000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 0000007F BA0F000000          <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000084 B823000000          <1>  mov eax, %1
    98                              <1> 
    99 00000089 CD40                <1>  int 40h
   175                                  _1:
   176                                  	; 19/06/2017
   177                                  	; Allocate Audio Buffer (for user)
   178                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 0000008B BB00020000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 00000090 B900800000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 00000095 BA[00000100]        <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 0000009A B820000000          <1>  mov eax, %1
    98                              <1> 
    99 0000009F CD40                <1>  int 40h
   179 000000A1 0F82DB000000            	jc	error_exit
   180                                  _2:
   181                                  	; Initialize Audio Device
   182                                  	sys	_audio, 0301h, 0, ac97_int_handler 
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 000000A7 BB01030000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 000000AC B900000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 000000B1 BA[7E020000]        <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000000B6 B820000000          <1>  mov eax, %1
    98                              <1> 
    99 000000BB CD40                <1>  int 40h
   183 000000BD 0F82BF000000            	jc	error_exit
   184                                  
   185                                  	; 27/12/2024
   186                                  	; Set Master Volume Level (to 0)
   187                                  	;sys	_audio, 0B00h, 0
   188                                  
   189                                  LoadMod:  
   190 000000C3 BF[C87B0000]            	mov	edi, mod_file_name
   191 000000C8 E8CC020000              	call    LoadModule		; Load the MODule...
   192                                  	; 08/10/2017
   193 000000CD 731B                    	jnc	short _3		; any error loading?
   194                                  
   195                                  	; yes, print error and Exit.
   196                                  
   197                                  	sys	_msg, ErrorMesg, 255, 0Fh
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 000000CF BB[BE0D0000]        <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 000000D4 B9FF000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 000000D9 BA0F000000          <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000000DE B823000000          <1>  mov eax, %1
    98                              <1> 
    99 000000E3 CD40                <1>  int 40h
   198                                  
   199 000000E5 E934010000              	jmp     Exit
   200                                  
   201                                  _3:
   202                                  	; 10/06/2017
   203                                  	sys	_audio, 0E00h ; get audio controller info
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 000000EA BB000E0000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000000EF B820000000          <1>  mov eax, %1
    98                              <1> 
    99 000000F4 CD40                <1>  int 40h
   204 000000F6 0F8286000000            	jc	error_exit
   205                                  
   206                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   207                                  	;jne	_dev_not_ready	
   208                                  
   209                                  	; EAX = IRQ Number in AL
   210                                  	;	Audio Device Number in AH 
   211                                  	; EBX = DEV/VENDOR ID
   212                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   213                                  	; ECX = BUS/DEV/FN 
   214                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   215                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   216                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   217                                  	;      (Low word, DX = NAMBAR address)
   218                                  
   219 000000FC A2[200F0000]            	mov	[ac97_int_ln_reg], al
   220 00000101 891D[100F0000]          	mov	[dev_vendor], ebx
   221 00000107 890D[140F0000]          	mov	[bus_dev_fn], ecx
   222 0000010D 668915[1C0F0000]        	mov	[ac97_NamBar], dx
   223                                  	;mov	[ac97_NamBar], dx
   224                                  	;shr	dx, 16
   225                                  	;mov	[ac97_NabmBar], dx
   226 00000114 8915[1C0F0000]          	mov	[ac97_NamBar], edx	
   227                                    
   228 0000011A E82C0A0000              	call	write_audio_dev_info 
   229                                  
   230                                  PlayNow: 
   231 0000011F E825090000              	call    StartPlaying
   232                                  
   233                                          ; load 32768 bytes into audio buffer
   234                                  	;mov	edi, Audio_Buffer
   235                                  	;mov	ebx, BUFFERSIZE
   236                                  	; 24/06/2017
   237                                          ; load 8192 bytes into audio buffer
   238 00000124 BF[00800100]            	mov	edi, temp_buffer
   239 00000129 BB00200000              	mov	ebx, BUFFERSIZE / 4
   240 0000012E E899080000              	call	GetSamples
   241 00000133 724D                    	jc	error_exit
   242                                  
   243                                  	; 24/06/2017
   244                                  	; 8 bit to 16 bit (*2)
   245                                  	; mono to stereo (*2)
   246                                  	; 4* (BUFFERSIZE/4) 
   247                                  	; source = temp_buffer
   248                                  	; destination = Audio_Buffer
   249 00000135 E8E4090000              	call 	ConvertSamples
   250                                  
   251                                  	; 27/12/2024
   252                                  	; bh = 16 : update (current, first) dma half buffer
   253                                  	; bl = 0  : then switch to the next (second) half buffer
   254                                  	sys	_audio, 1000h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 0000013A BB00100000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 0000013F B820000000          <1>  mov eax, %1
    98                              <1> 
    99 00000144 CD40                <1>  int 40h
   255                                  
   256                                  	; 27/12/2024
   257                                          ; load 8192 bytes into audio buffer
   258 00000146 BF[00800100]            	mov	edi, temp_buffer
   259 0000014B BB00200000              	mov	ebx, BUFFERSIZE / 4
   260 00000150 E877080000              	call	GetSamples
   261                                  	;jc	error_exit
   262 00000155 7205                    	jc	short _@
   263                                  
   264                                  	; 27/12/2024
   265 00000157 E8C2090000              	call 	ConvertSamples
   266                                  _@:
   267                                  	; 27/12/2024
   268                                  	; Set Master Volume Level
   269                                  	sys	_audio, 0B00h, 1D1Dh
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 0000015C BB000B0000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 00000161 B91D1D0000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000166 B820000000          <1>  mov eax, %1
    98                              <1> 
    99 0000016B CD40                <1>  int 40h
   270                                  
   271                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   272                                  
   273                                  	;;;;
   274                                  	; 27/12/2024
   275                                  	; Set Video Mode to 101h ; 640x480, 256 colors
   276                                  	sys	_video, 08FFh, 101h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 0000016D BBFF080000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 00000172 B901010000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000177 B81F000000          <1>  mov eax, %1
    98                              <1> 
    99 0000017C CD40                <1>  int 40h
   277 0000017E 09C0                    	or	eax, eax
   278 00000180 751B                    	jnz	short set_vesa_mode_101h_ok
   279                                  
   280                                  	; write (OS) error msg and exit
   281                                  error_exit:
   282                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000182 BB[DB0D0000]        <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 00000187 B9FF000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 0000018C BA0E000000          <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000191 B823000000          <1>  mov eax, %1
    98                              <1> 
    99 00000196 CD40                <1>  int 40h
   283 00000198 E981000000              	jmp	Exit
   284                                  
   285                                  set_vesa_mode_101h_ok:
   286                                  	; linear frame buffer access
   287                                  	sys	_video, 06FFh
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 0000019D BBFF060000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000001A2 B81F000000          <1>  mov eax, %1
    98                              <1> 
    99 000001A7 CD40                <1>  int 40h
   288 000001A9 21C0                    	and	eax, eax
   289 000001AB 7507                    	jnz	short _a3
   290                                  
   291                                  	; set text mode and write err msg
   292 000001AD E88D000000              	call	set_text_mode
   293 000001B2 EBCE                    	jmp	short error_exit
   294                                  _a3:
   295 000001B4 A3[C47B0000]            	mov	[LFB_ADDR], eax
   296                                  	;;;;
   297                                  
   298                                  	; 27/12/2024
   299 000001B9 B900010000              	mov	ecx, 256
   300                                  %if 0
   301                                  	;mov	ecx, 128	; Make a lookup table
   302                                  	;;mov	cl, 128
   303                                  	xor     ebx, ebx	; for fastest pixel
   304                                  	;mov	edx, 320*(100-64) ; addressing.
   305                                  	; 27/12/2024
   306                                  	mov	edx, 640*(240-128)
   307                                  MakeOfs:        
   308                                  	;mov	[RowOfs+ebx], dx
   309                                  	;mov	[RowOfs+ebx+2], dx
   310                                  	; 27/12/2024
   311                                  	mov	[RowOfs+ebx], edx
   312                                  	;add	dx, 320
   313                                  	;add	ebx, 4
   314                                  	add	edx, 640
   315                                  	add	ebx, 4
   316                                  	loop    MakeOfs
   317                                  %else
   318                                  	; 27/12/2024
   319 000001BE B900010000              	mov	ecx, 256
   320 000001C3 BF[C0770000]            	mov	edi, RowOfs
   321 000001C8 A1[C47B0000]            	mov	eax, [LFB_ADDR]
   322 000001CD 0500180100              	add	eax, 640*(240-128)
   323                                  MakeOfs:
   324 000001D2 AB                      	stosd
   325 000001D3 0580020000              	add	eax, 640
   326 000001D8 E2F8                    	loop	MakeOfs
   327                                  %endif
   328                                  	
   329                                  	; Start	to play
   330 000001DA A0[640E0000]            	mov	al, [bps]
   331 000001DF C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   332 000001E2 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   333 000001E4 8A1D[630E0000]          	mov	bl, [stmo]
   334 000001EA FECB                    	dec	bl
   335 000001EC 08C3                    	or	bl, al
   336 000001EE 668B0D[650E0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   337 000001F5 B704                    	mov	bh, 4 ; start to play	
   338                                  	sys	_audio
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89                              <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000001F7 B820000000          <1>  mov eax, %1
    98                              <1> 
    99 000001FC CD40                <1>  int 40h
   339                                      
   340                                  	;; SETUP SIGNAL RESPONSE BYTE
   341                                  	;; 06/03/2017
   342                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   343                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   344                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   345                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   346                                  	;sys	_calbac
   347                                  	;jc	short error_exit
   348                                  
   349                                  	;; DIRECT VGA MEMORY ACCESS
   350                                  	;; bl = 0, bh = 5
   351                                  	;; Direct access/map to VGA memory (0A0000h)
   352                                  
   353                                  	;sys	_video, 0500h
   354                                  	;cmp	eax, 0A0000h
   355                                  	;je	short _a3
   356                                  ;error_exit:
   357                                  	;sys	_msg, trdos386_err_msg, 255, 0Eh
   358                                  	;jmp	short Exit
   359                                  
   360                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   361                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   362                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   363                                  ;       second, or the module will sound "looped".
   364                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   365                                  ;       the polling is called from my routine, and then the irq 0 must be
   366                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   367                                  ;       samples played by the Sound Blaster. Note that some samples are
   368                                  ;       discarded in the next code, just for fun!
   369                                  
   370                                  ;_a3:
   371                                  ;	mov     ax, 0013h	; Set Mode 320x200x256
   372                                  ;	int     31h
   373                                  
   374                                  	; 27/12/2024
   375                                  	; Set Master Volume Level (to 29) -max:31-
   376                                  	sys	_audio, 0B00h, 1D1Dh
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 000001FE BB000B0000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 00000203 B91D1D0000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000208 B820000000          <1>  mov eax, %1
    98                              <1> 
    99 0000020D CD40                <1>  int 40h
   377                                  
   378                                  	; 24/06/2017
   379 0000020F E87F000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   380                                  
   381                                  _s_exit:
   382 00000214 E8D4080000              	call	StopPlaying	; STOP!
   383                                  
   384                                  	; 27/12/2024
   385 00000219 E821000000              	call	set_text_mode
   386                                  Exit:           
   387                                  	;call    FreeModule	; Free MODule core.
   388                                  	
   389                                  	sys 	_exit	; Bye !
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89                              <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 0000021E B801000000          <1>  mov eax, %1
    98                              <1> 
    99 00000223 CD40                <1>  int 40h
   390                                  here:
   391 00000225 EBFE                    	jmp	short here
   392                                  
   393                                  pmsg_2017:
   394                                  	sys	_msg, msg_2017, 255, 0Fh
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000227 BB[160D0000]        <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 0000022C B9FF000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 00000231 BA0F000000          <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000236 B823000000          <1>  mov eax, %1
    98                              <1> 
    99 0000023B CD40                <1>  int 40h
   395 0000023D EBDF                    	jmp	short Exit
   396                                  
   397                                  	; 27/12/2024
   398                                  set_text_mode:
   399 0000023F 66B80300                	mov	ax, 0003h	; Set Text Mode 80x25x16
   400 00000243 CD31                    	int     31h
   401 00000245 C3                      	retn
   402                                  
   403                                  DetectICH:
   404                                  	; 24/06/2017
   405                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   406                                          sys	_audio, 0102h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000246 BB02010000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 0000024B B820000000          <1>  mov eax, %1
    98                              <1> 
    99 00000250 CD40                <1>  int 40h
   407 00000252 C3                      	retn
   408                                  
   409                                  noDevMsg:
   410 00000253 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   410 0000025C 61626C6520746F2066-
   410 00000265 696E64204143393720-
   410 0000026E 617564696F20646576-
   410 00000277 696365210D0A00     
   411                                  
   412                                  ac97_int_handler:
   413                                  	; 19/06/2017
   414 0000027E C605[210F0000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   415                                  
   416                                  	sys	_rele ; return from callback service 
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89                              <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000285 B827000000          <1>  mov eax, %1
    98                              <1> 
    99 0000028A CD40                <1>  int 40h
   417                                  	; we must not come here !
   418                                  	sys	_exit
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89                              <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 0000028C B801000000          <1>  mov eax, %1
    98                              <1> 
    99 00000291 CD40                <1>  int 40h
   419                                  
   420                                  ;=============================================================================
   421                                  ;      
   422                                  ;=============================================================================
   423                                  
   424                                  	; 27/12/2024
   425                                  PlayMod:
   426                                  	; 23/06/2017   
   427                                  	; 21/06/2017
   428                                  	; 19/06/2017
   429                                  
   430                                  	; 05/03/2017 (TRDOS 386)
   431                                  	; 14/02/2017
   432                                  	; 13/02/2017
   433                                  	; 08/12/2016
   434                                  	; 28/11/2016
   435                                  
   436 00000293 EB11                         	jmp	short modp_gs ; 23/06/2017
   437                                  
   438                                  	;;; 27/12/2024
   439                                  q_return:
   440 00000295 C3                      	retn
   441                                  	;;;
   442                                  
   443                                  p_loop:
   444 00000296 803D[210F0000]00        	cmp	byte [srb], 0
   445 0000029D 762F                    	jna	short q_loop
   446 0000029F C605[210F0000]00        	mov	byte [srb], 0
   447                                  modp_gs:
   448                                  	;mov	edi, Audio_Buffer
   449                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   450                                  	;call	GetSamples
   451                                  
   452                                  	; 24/06/2017
   453                                          ; load 8192 bytes into audio buffer
   454 000002A6 BF[00800100]            	mov	edi, temp_buffer
   455 000002AB BB00200000              	mov	ebx, BUFFERSIZE / 4
   456 000002B0 E817070000              	call	GetSamples
   457 000002B5 0F82C7FEFFFF            	jc	error_exit
   458                                  
   459                                  	; 24/06/2017
   460                                  	; 8 bit to 16 bit (*2)
   461                                  	; mono to stereo (*2)
   462                                  	; 4* (BUFFERSIZE/4) 
   463                                  	; source = temp_buffer
   464                                  	; destination = Audio_Buffer
   465 000002BB E85E080000              	call 	ConvertSamples
   466                                  
   467                                  	;;;
   468                                  	; 27/12/2024
   469 000002C0 803D[98030000]00        	cmp	byte [volume_change], 0
   470 000002C7 7605                    	jna	short q_loop
   471                                  
   472 000002C9 E8AD000000              	call	change_volume_level
   473                                  	;;;
   474                                  q_loop:
   475 000002CE B401                    	mov     ah, 1		; any key pressed?
   476 000002D0 CD32                    	int     32h		; no, Loop.
   477 000002D2 7435                    	jz	short r_loop
   478                                  
   479 000002D4 B400                    	mov     ah, 0		; flush key buffer...
   480 000002D6 CD32                    	int     32h
   481                                  
   482                                  ;q_return:
   483                                  	;retn
   484                                  
   485                                  	;;;
   486                                  	; 27/12/204 (ref: modplayx.s - 06/06/2024)
   487 000002D8 3C2B                    	cmp	al, '+' ; increase sound volume
   488 000002DA 7413                    	je	short inc_volume_level
   489 000002DC 3C2D                    	cmp	al, '-'
   490                                  	;je	short dec_volume_level
   491 000002DE 75B5                    	jne	short q_return
   492                                  ;q_return:
   493                                  	;retn
   494                                  
   495                                  dec_volume_level:
   496 000002E0 8A0D[97030000]          	mov	cl, [volume_level]
   497 000002E6 80F901                  	cmp	cl, 1 ; 1
   498                                  	;jna	short r_loop
   499                                  	; 27/12/2024
   500 000002E9 721E                    	jb	short r_loop
   501 000002EB FEC9                    	dec	cl
   502 000002ED EB0D                    	jmp	short volume_level_change
   503                                  
   504                                  inc_volume_level:
   505 000002EF 8A0D[97030000]          	mov	cl, [volume_level]
   506 000002F5 80F91F                  	cmp	cl, 1Fh ; 31
   507 000002F8 730F                    	jnb	short r_loop
   508 000002FA FEC1                    	inc	cl
   509                                  	; 27/12/2024
   510                                  volume_level_change:
   511 000002FC 880D[97030000]          	mov	[volume_level], cl
   512 00000302 C605[98030000]01        	mov	byte [volume_change], 1
   513                                  r_loop:
   514                                  	;;;
   515                                  	; 27/12/2024
   516                                  	sys	_time, 4 ; get timer ticks (18.2 ticks/second)
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000309 BB04000000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 0000030E B80D000000          <1>  mov eax, %1
    98                              <1> 
    99 00000313 CD40                <1>  int 40h
   517 00000315 3B05[C07B0000]          	cmp	eax, [timerticks]
   518 0000031B 0F8475FFFFFF            	je	p_loop
   519 00000321 A3[C07B0000]            	mov	[timerticks], eax
   520                                  	;;;
   521                                  
   522                                  
   523                                  	; 27/12/2024 (640 pixels)
   524                                  	; ----------
   525                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes))
   526                                  	; 23/06/2017
   527                                  	; 22/06/2017
   528                                  	; bh = 15, get current sound data/samples
   529                                  	; bl = 0, for PCM OUT
   530                                  	; ecx = count of sample/data bytes (1 to 4096)
   531                                  	; edx = destination buffer address 
   532                                  	;	(page aligned address is better)
   533                                  	;
   534                                  	;sys	_audio, 0F00h, 320*4, g_buff
   535                                  
   536                                  	; 27/12/2024
   537                                  	sys	_audio, 0F00h, 640*4, g_buff
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000326 BB000F0000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 0000032B B9000A0000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 00000330 BA[00800000]        <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000335 B820000000          <1>  mov eax, %1
    98                              <1> 
    99 0000033A CD40                <1>  int 40h
   538                                  
   539                                  	; 27/12/2024
   540                                  ScopeLoop:
   541                                  	;mov	edi, 0A0000h	; VGA display memory address
   542                                  	; 27/12/2024
   543                                  	;mov	edi, [LFB_ADDR]
   544                                  	; 19/06/2017
   545 0000033C BE[00800000]            	mov     esi, g_buff	; display current samples
   546 00000341 31C9                    	xor     ecx, ecx	; to be drawed ...
   547 00000343 31D2                    	xor     edx, edx
   548                                  DrawLoop:       
   549                                  	;mov    ebx, edx	; (save Index)
   550                                  	;mov    di, [Scope+ebx]	; get old SCOPE pixel address
   551                                  	; 27/12/2024
   552                                  	;mov	edi, [Scope+ebx]
   553 00000345 8BBA[C06D0000]          	mov	edi, [Scope+edx]
   554 0000034B C60700                  	mov     byte [edi], 0	; erase it!
   555                                  	; 24/06/2017
   556 0000034E AD                      	lodsd
   557 0000034F 80C480                  	add	ah, 80h
   558                                  	;mov	bl, ah
   559                                  	; 27/12/2024
   560 00000352 31DB                    	xor	ebx, ebx
   561 00000354 88E3                    	mov	bl, ah
   562                                  	;
   563                                  	;xor	bh, bh
   564                                  	;shl	bx, 1
   565                                  	;mov	di, [RowOfs+ebx]
   566                                  	;add	di, cx
   567                                  	;mov	bx, dx		; (restore Index)
   568                                  	;mov	[Scope+ebx], di	; save new address...
   569                                  	; 27/12/2024
   570                                  	;shl	ebx, 1
   571 00000356 C1E302                  	shl	ebx, 2	; max. 255*4 (row 112 + w_row 0 to 255)
   572 00000359 8BBB[C0770000]          	mov	edi, [RowOfs+ebx] ; row start position/offset
   573 0000035F 01CF                    	add	edi, ecx	; column
   574                                  	;mov	ebx, edx
   575                                  	;mov	[Scope+ebx], edi
   576                                  	; 27/12/2024
   577 00000361 89BA[C06D0000]          	mov	[Scope+edx], edi
   578 00000367 C6070A                  	mov     byte [edi], 10	; and DRAW.
   579                                  	;add	dx, 2		; the next pixel...
   580 0000036A 83C204                  	add	edx, 4
   581 0000036D 41                      	inc     ecx
   582                                  	;cmp	cx, 320		; 320 pixels drawed?
   583                                  	; 27/12/2024
   584 0000036E 81F980020000            	cmp	ecx, 640 	; 640 pixels drawn?	
   585 00000374 72CF                    	jb      short DrawLoop
   586 00000376 E91BFFFFFF              	jmp	p_loop
   587                                  
   588                                  ; ----------------------------------------------------------------------------
   589                                  
   590                                  	; 27/12/2024
   591                                  change_volume_level:
   592 0000037B 8A0D[97030000]          	mov	cl, [volume_level]
   593 00000381 88CD                    	mov	ch, cl
   594                                  	; Set Master Volume Level
   595                                  	sys	_audio, 0B00h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000383 BB000B0000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000388 B820000000          <1>  mov eax, %1
    98                              <1> 
    99 0000038D CD40                <1>  int 40h
   596 0000038F C605[98030000]00        	mov	byte [volume_change], 0 ; reset volume change (required) flag
   597 00000396 C3                      	retn
   598                                  
   599                                  ;;;; 27/12/2024
   600 00000397 1D                      volume_level: db 1Dh
   601 00000398 01                      volume_change: db 1
   602                                  ;;;;
   603                                  
   604                                  ;=============================================================================
   605                                  ;               MODLOAD.ASM
   606                                  ;=============================================================================
   607                                  
   608                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   609                                  ;	July 10th, 1993.
   610                                  
   611                                  ; STRUCTURES
   612                                  
   613                                  struc ModSample
   614 00000000 <res 16h>               .msName:	resb 22
   615 00000016 ????                    .msLength:	resw 1
   616 00000018 ??                      .msFinetune:	resb 1
   617 00000019 ??                      .msVolume:	resb 1
   618 0000001A ????                    .msRepeat:	resw 1
   619 0000001C ????                    .msRepLen:	resw 1
   620                                  .size:
   621                                  endstruc
   622                                  
   623                                  struc ModHeader
   624 00000000 <res 14h>               .mhName:	resb 20
   625 00000014 <res 3A2h>              .mhSamples:	resb ModSample.size*31
   626 000003B6 ??                      .mhOrderLen:	resb 1
   627 000003B7 ??                      .mhReStart:	resb 1
   628 000003B8 <res 80h>               .mhOrder:	resb 128
   629 00000438 ????????                .mhSign:	resw 2
   630                                  .size:	
   631                                  endstruc
   632                                  
   633                                  struc ModInfoRec
   634 00000000 ??                      .OrderLen:	resb 1
   635 00000001 ??                      .ReStart:	resb 1
   636 00000002 <res 80h>               .Order:	resb 128
   637 00000082 ????????                .Patterns:	resd 1
   638 00000086 <res 3Eh>               .SampOfs:	resw 31
   639 000000C4 <res 3Eh>               .SampSeg:	resw 31
   640 00000102 <res 3Eh>               .SampLen:	resw 31
   641 00000140 <res 3Eh>               .SampRep:	resw 31
   642 0000017E <res 3Eh>               .SampRepLen:	resw 31
   643 000001BC <res 3Eh>               .SampVol:	resw 31
   644                                  .size:	
   645                                  endstruc
   646                                  
   647                                  ; CODE
   648                                  
   649                                  ; 07/10/2017 (modplay.s)
   650                                  
   651                                  LoadModule:
   652                                  	; edi = file name address
   653                                  
   654 00000399 60                      	pushad
   655                                  	
   656                                  	;call    ClearModInfo ; 07/10/2017 (not necessary.)
   657                                  OpenFile:       
   658                                  	; ebx = ASCIIZ file name address
   659                                  	; ecx = open mode (0 = open for read)	
   660                                  	sys	_open, edi, 0 ; open for reading
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 0000039A 89FB                <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 0000039C B900000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000003A1 B805000000          <1>  mov eax, %1
    98                              <1> 
    99 000003A6 CD40                <1>  int 40h
   661 000003A8 0F8244010000            	jc	Failed
   662 000003AE A3[220F0000]            	mov     [FileHandle], eax
   663                                  ReadHeader:
   664                                  	; ebx = File handle
   665                                  	; ecx = Buffer address
   666                                  	; edx = Byte count
   667                                  	sys	_read, [FileHandle], Header, ModHeader.size
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 000003B3 8B1D[220F0000]      <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 000003B9 B9[260F0000]        <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 000003BE BA3C040000          <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000003C3 B803000000          <1>  mov eax, %1
    98                              <1> 
    99 000003C8 CD40                <1>  int 40h
   668 000003CA 0F8213010000            	jc      CloseFile
   669                                  CheckMK:        
   670 000003D0 813D[5E130000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   670 000003D8 4B2E               
   671 000003DA 7412                    	je      short IsModFile
   672                                  CheckFLT4:
   673 000003DC 813D[5E130000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   673 000003E4 5434               
   674 000003E6 7406                    	je      short IsModFile
   675                                  	; 07/10/2017
   676 000003E8 F9                      	stc
   677 000003E9 E9F5000000              	jmp	CloseFile
   678                                  IsModFile:
   679 000003EE A0[DC120000]            	mov     al, [Header+ModHeader.mhOrderLen]
   680 000003F3 A2[62130000]            	mov     [ModInfo.OrderLen], al
   681                                  
   682 000003F8 A0[DD120000]            	mov     al, [Header+ModHeader.mhReStart]
   683 000003FD 3A05[DC120000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   684 00000403 7202                    	jb      short SetReStart
   685 00000405 B07F                    	mov     al, 7Fh
   686                                  SetReStart:
   687 00000407 A2[63130000]            	mov     [ModInfo.ReStart], al
   688                                  
   689                                  	;mov	ecx, 128
   690 0000040C 66B98000                	mov	cx, 128
   691 00000410 31D2                    	xor     edx, edx
   692 00000412 31DB                    	xor     ebx, ebx
   693                                  CopyOrder:
   694 00000414 8AB3[DE120000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   695 0000041A 88B3[64130000]          	mov     [ModInfo.Order+ebx], dh
   696 00000420 38D6                    	cmp     dh, dl
   697 00000422 7202                    	jb      short NextOrder
   698 00000424 88F2                    	mov     dl, dh
   699                                  NextOrder:
   700 00000426 43                      	inc     ebx
   701 00000427 E2EB                    	loop    CopyOrder
   702                                  AllocPatterns:  
   703 00000429 81E2FF000000            	and	edx, 0FFh
   704                                  	;inc	dx
   705 0000042F FEC2                    	inc	dl  ; 07/10/2017
   706                                  	; dl = count of 1024 bytes ; count of patterns (04/07/2017)
   707 00000431 C1E20A                  	shl	edx, 10 ; *1024 ; (count of patterns *64*16)
   708                                  
   709 00000434 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   710                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   711 00000436 B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   712                                  	;
   713 0000043B 890D[E4130000]          	mov	[ModInfo.Patterns], ecx
   714                                  	;
   715 00000441 01CD                    	add	ebp, ecx ; next offset for samples
   716                                  ReadPatterns:  
   717                                  	;mov	ebx, [FileHandle] 
   718                                  	; ebx = File handle
   719                                  	; ecx = Buffer address
   720                                  	; edx = Byte count
   721                                  	sys	_read, [FileHandle]
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000443 8B1D[220F0000]      <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000449 B803000000          <1>  mov eax, %1
    98                              <1> 
    99 0000044E CD40                <1>  int 40h
   722 00000450 0F828D000000            	jc      CloseFile
   723                                  
   724                                  	; paterns have been loaded here... (04/07/2017)
   725                                  
   726 00000456 BE[3A0F0000]            	mov	esi, Header+ModHeader.mhSamples
   727 0000045B 31FF                    	xor     edi, edi
   728                                  CopySamples:
   729 0000045D 668B4616                	mov     ax, [esi+ModSample.msLength]
   730 00000461 86E0                    	xchg    al, ah
   731 00000463 66D1E0                  	shl     ax, 1
   732 00000466 668987[64140000]        	mov     [ModInfo.SampLen+edi], ax
   733 0000046D 8A4619                  	mov     al, [esi+ModSample.msVolume]
   734 00000470 30E4                    	xor     ah, ah
   735 00000472 668987[1E150000]        	mov     [ModInfo.SampVol+edi], ax
   736 00000479 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   737 0000047D 86E0                    	xchg    al, ah
   738 0000047F 66D1E0                  	shl     ax, 1
   739 00000482 668987[A2140000]        	mov     [ModInfo.SampRep+edi], ax
   740 00000489 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   741 0000048D 86E0                    	xchg    al, ah
   742 0000048F 66D1E0                  	shl     ax, 1
   743 00000492 668987[E0140000]        	mov     [ModInfo.SampRepLen+edi], ax
   744 00000499 83C61E                  	add     esi, ModSample.size
   745 0000049C 6683C702                	add     di, 2
   746 000004A0 6683FF3E                	cmp     di, 2*31
   747 000004A4 72B7                    	jb      short CopySamples
   748                                  
   749 000004A6 31F6                    	xor     esi, esi
   750                                  AllocSamples:
   751 000004A8 0FB796[64140000]        	movzx	edx, word [ModInfo.SampLen+esi]
   752                                  	; 07/10/2017
   753                                  	;shr	dx, 4 ; ***
   754 000004AF 21D2                    	and	edx, edx
   755 000004B1 7426                    	jz      short NextSample
   756                                  	;inc	dx  ; number of paragraphs ; ***
   757                                  	;shl	dx, 4 ; ***
   758 000004B3 89E8                    	mov	eax, ebp
   759 000004B5 668986[E8130000]        	mov	[ModInfo.SampOfs+esi], ax
   760 000004BC C1E810                  	shr	eax, 16
   761 000004BF 668986[26140000]        	mov	[ModInfo.SampSeg+esi], ax
   762 000004C6 89E9                    	mov	ecx, ebp
   763 000004C8 01D5                    	add	ebp, edx ; next offset for sample 
   764                                  ReadSample:
   765                                  	;mov	ebx, [FileHandle]
   766                                  	;movzx  edx, [ModInfo.SampLen+esi]
   767                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   768                                  
   769                                  	; ebx = File handle
   770                                  	; ecx = Buffer address
   771                                  	; edx = Byte count
   772                                  	sys	_read, [FileHandle]
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 000004CA 8B1D[220F0000]      <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000004D0 B803000000          <1>  mov eax, %1
    98                              <1> 
    99 000004D5 CD40                <1>  int 40h
   773 000004D7 720A                    	jc      short CloseFile
   774                                  
   775                                  NextSample:
   776 000004D9 6683C602                	add     si, 2
   777 000004DD 6683FE3E                	cmp     si, 2*31
   778 000004E1 72C5                    	jb      short AllocSamples
   779                                  CloseFile:      
   780 000004E3 9C                      	pushf
   781                                  	sys	_close, [FileHandle]
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 000004E4 8B1D[220F0000]      <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 000004EA B806000000          <1>  mov eax, %1
    98                              <1> 
    99 000004EF CD40                <1>  int 40h
   782 000004F1 9D                      	popf
   783                                  Failed:         
   784 000004F2 61                      	popad
   785                                  
   786 000004F3 C3                      	retn
   787                                  
   788                                  FreeModule:
   789                                  	; Erdogan Tan (13/02/2017)
   790                                  	; nothing to do here for memory de-allocation
   791                                  ClearModInfo:
   792 000004F4 57                      	push	edi
   793 000004F5 BF[62130000]            	mov	edi, ModInfo
   794 000004FA B9FA010000              	mov     ecx, ModInfoRec.size
   795                                  	;cld
   796 000004FF 30C0                    	xor     al, al
   797 00000501 F3AA                    	rep     stosb
   798 00000503 5F                      	pop	edi
   799 00000504 C3                      	retn
   800                                  
   801                                  ;=============================================================================
   802                                  ;               MODPLAY.ASM
   803                                  ;=============================================================================
   804                                  
   805                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   806                                  ;	July 23th, 1993.
   807                                  
   808                                  ; EQUATES
   809                                  
   810                                  NumTracks       equ 4
   811                                  DefTempo        equ 6
   812                                  DefBpm          equ 125
   813                                  MidCRate        equ 8448
   814                                  MixBufSize      equ 4096
   815                                  
   816                                  ; STRUCTURES
   817                                  
   818                                  struc TrackInfo
   819 00000000 ????????                .Samples:	resd 1
   820 00000004 ????????                .Position:	resd 1
   821 00000008 ????                    .Len:	resw 1
   822 0000000A ????                    .Repeat:	resw 1
   823 0000000C ????                    .RepLen:	resw 1
   824 0000000E ??                      .Volume: 	resb 1
   825 0000000F ??                      .Error:	resb 1
   826 00000010 ????                    .Period:	resw 1
   827 00000012 ????                    .Pitch:	resw 1
   828 00000014 ????                    .Effect:	resw 1
   829 00000016 ????                    .PortTo:	resw 1
   830 00000018 ??                      .PortParm:	resb 1
   831 00000019 ??                      .VibPos:	resb 1
   832 0000001A ??                      .VibParm:	resb 1
   833 0000001B ??                      .OldSampOfs:	resb 1
   834 0000001C ????????????            .Arp:	resw 3
   835 00000022 ????                    .ArpIndex:	resw 1
   836                                  .size:
   837                                  endstruc
   838                                  
   839                                  ; CODE
   840                                  
   841                                  ;--------------------------------------------------------------------------
   842                                  ; BeatTrack:  Process the next beat in one track.
   843                                  ;  In:
   844                                  ;    ds:di -  Track info Address.
   845                                  ;--------------------------------------------------------------------------
   846                                  
   847                                  ; edi = Track info address
   848                                  
   849                                  BeatTrack:
   850 00000505 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   851 00000509 6685D2                  	test    dx, dx
   852 0000050C 743C                    	je      short None
   853 0000050E 80FE00                  	cmp     dh, 00h
   854 00000511 7438                    	je      short Arpeggio
   855 00000513 80FE01                  	cmp     dh, 01h
   856 00000516 7451                    	je      short PortUp
   857 00000518 80FE02                  	cmp     dh, 02h
   858 0000051B 7471                    	je      short PortDown
   859 0000051D 80FE03                  	cmp     dh, 03h
   860 00000520 0F848E000000            	je      TonePort
   861 00000526 80FE04                  	cmp     dh, 04h
   862 00000529 0F84BD000000            	je      Vibrato
   863 0000052F 80FE05                  	cmp     dh, 05h
   864 00000532 0F840E010000            	je      PortSlide
   865 00000538 80FE06                  	cmp     dh, 06h
   866 0000053B 0F8412010000            	je      VibSlide
   867 00000541 80FE0A                  	cmp     dh, 0Ah
   868 00000544 0F8413010000            	je      VolSlide
   869                                  None:           
   870 0000054A C3                      	retn
   871                                  Arpeggio:
   872 0000054B 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   873 0000054F 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   874 00000554 66894712                	mov     [edi+TrackInfo.Pitch], ax
   875 00000558 6683C302                	add     bx, 2
   876 0000055C 6683FB06                	cmp     bx, 6
   877 00000560 7202                    	jb      short SetArpIndex
   878 00000562 31DB                    	xor     ebx, ebx
   879                                  SetArpIndex:
   880 00000564 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   881 00000568 C3                      	retn
   882                                  PortUp:
   883 00000569 30F6                    	xor     dh, dh
   884 0000056B 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   885 0000056F 6629D3                  	sub     bx, dx
   886 00000572 6683FB71                	cmp     bx, 113
   887 00000576 7D04                    	jge     short NotSmall
   888 00000578 66BB7100                	mov     bx, 113
   889                                  NotSmall:
   890 0000057C 66895F10                	mov     [edi+TrackInfo.Period], bx
   891 00000580 6601DB                  	add     bx, bx
   892 00000583 66678B87[5C15]          	mov     ax, [PitchTable+bx]
   893 00000589 66894712                	mov     [edi+TrackInfo.Pitch], ax
   894 0000058D C3                      	retn
   895                                  PortDown:
   896 0000058E 30F6                    	xor     dh, dh
   897 00000590 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   898 00000594 6601D3                  	add     bx, dx
   899 00000597 6681FB5803              	cmp     bx, 856
   900 0000059C 7E04                    	jle     short NotBig
   901 0000059E 66BB5803                	mov     bx, 856
   902 000005A2 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   903 000005A6 6601DB                  	add     bx, bx
   904 000005A9 66678B87[5C15]          	mov     ax, [PitchTable+bx]
   905 000005AF 66894712                	mov     [edi+TrackInfo.Pitch], ax
   906 000005B3 C3                      	retn
   907                                  TonePort:
   908 000005B4 30F6                    	xor     dh, dh
   909 000005B6 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   910 000005BA 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   911 000005BE 6639C3                  	cmp     bx, ax
   912 000005C1 7428                    	je      short NoPort
   913 000005C3 7F0D                    	jg      short PortToUp
   914                                  PortToDown:     
   915 000005C5 6601D3                  	add     bx, dx
   916 000005C8 6639C3                  	cmp     bx, ax
   917 000005CB 7E0D                    	jle     short SetPort
   918                                  FixPort:        
   919 000005CD 6689C3                  	mov     bx, ax
   920 000005D0 EB08                    	jmp     short SetPort
   921                                  PortToUp:
   922 000005D2 6629D3                  	sub     bx, dx
   923 000005D5 6639C3                  	cmp     bx, ax
   924 000005D8 7CF3                    	jl      short FixPort
   925                                  SetPort:        
   926 000005DA 66895F10                	mov     [edi+TrackInfo.Period], bx
   927 000005DE 6601DB                  	add     bx, bx
   928 000005E1 66678B87[5C15]          	mov     ax, [PitchTable+bx]
   929 000005E7 66894712                	mov     [edi+TrackInfo.Pitch], ax
   930                                  NoPort:         
   931 000005EB C3                      	retn
   932                                  Vibrato:
   933 000005EC 88D6                    	mov     dh, dl
   934 000005EE 80E20F                  	and     dl, 0Fh
   935 000005F1 C0EE04                  	shr     dh, 4
   936 000005F4 C0E602                  	shl     dh, 2
   937 000005F7 007719                  	add     [edi+TrackInfo.VibPos], dh
   938 000005FA 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   939 000005FD 88F3                    	mov     bl, dh
   940 000005FF C0EB02                  	shr     bl, 2
   941 00000602 6683E31F                	and     bx, 1Fh
   942 00000606 678A87[FB0D]            	mov     al, [SinTable+bx]
   943 0000060B F6E2                    	mul     dl
   944 0000060D 66D1C0                  	rol     ax, 1
   945 00000610 86E0                    	xchg    al, ah
   946 00000612 80E401                  	and     ah, 1
   947 00000615 84F6                    	test    dh, dh
   948 00000617 7903                    	jns     short VibUp
   949 00000619 66F7D8                  	neg     ax
   950                                  VibUp:          
   951 0000061C 66034710                	add     ax, [edi+TrackInfo.Period]
   952 00000620 6689C3                  	mov     bx, ax
   953 00000623 6683FB71                	cmp     bx, 113
   954 00000627 7D04                    	jge     short NoLoVib
   955 00000629 66BB7100                	mov     bx, 113
   956                                  NoLoVib:        
   957 0000062D 6681FB5803              	cmp     bx, 856
   958 00000632 7E04                    	jle     short NoHiVib
   959 00000634 66BB5803                	mov     bx, 856
   960                                  NoHiVib:        
   961 00000638 6601DB                  	add     bx, bx
   962 0000063B 66678B87[5C15]          	mov     ax, [PitchTable+bx]
   963 00000641 66894712                	mov     [edi+TrackInfo.Pitch], ax
   964 00000645 C3                      	retn
   965                                  PortSlide:
   966 00000646 E812000000              	call    VolSlide
   967 0000064B 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   968 0000064E E961FFFFFF              	jmp     TonePort
   969                                  VibSlide:
   970 00000653 E805000000              	call    VolSlide
   971 00000658 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   972 0000065B EB8F                    	jmp     short Vibrato
   973                                  VolSlide:
   974 0000065D 88D6                    	mov     dh, dl
   975 0000065F 80E20F                  	and     dl, 0Fh
   976 00000662 C0EE04                  	shr     dh, 4
   977 00000665 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   978 00000668 28D0                    	sub     al, dl
   979 0000066A 7D02                    	jge     short NoLoVol
   980 0000066C 30C0                    	xor     al, al
   981                                  NoLoVol:        
   982 0000066E 00F0                    	add     al, dh
   983 00000670 3C40                    	cmp     al, 64
   984 00000672 7602                    	jbe     short NoHiVol
   985 00000674 B040                    	mov     al, 64
   986                                  NoHiVol:        
   987 00000676 88470E                  	mov     [edi+TrackInfo.Volume], al
   988 00000679 C3                      	retn
   989                                  
   990                                  ;--------------------------------------------------------------------------
   991                                  ; GetTrack:   Get the next Note from a pattern.
   992                                  ;  In:
   993                                  ;    ds:di -  Track info Address.
   994                                  ;    es:si -  Pattern Note Address.
   995                                  ; Out:
   996                                  ;    es:si -  The Next Pattern Note address.
   997                                  ;--------------------------------------------------------------------------
   998                                  
   999                                  ; esi = Pattern note address
  1000                                  ; edi = Track info address
  1001                                  
  1002                                  GetTrack:
  1003 0000067A 66AD                    	lodsw
  1004 0000067C 86E0                    	xchg    al, ah
  1005 0000067E 88E3                    	mov	bl, ah
  1006 00000680 80E40F                  	and     ah, 0Fh
  1007 00000683 6689C1                  	mov     cx, ax
  1008 00000686 66AD                    	lodsw
  1009 00000688 86E0                    	xchg    al, ah
  1010 0000068A 88E7                    	mov     bh, ah
  1011 0000068C 80E40F                  	and     ah, 0Fh
  1012 0000068F 6689C2                  	mov     dx, ax
  1013 00000692 66895714                	mov     [edi+TrackInfo.Effect], dx
  1014 00000696 80E3F0                  	and     bl, 0F0h
  1015 00000699 C0EF04                  	shr     bh, 4
  1016 0000069C 08FB                    	or      bl, bh
  1017 0000069E 7449                    	je      short SetPeriod
  1018                                  SetSample:
  1019                                  	;xor    bh, bh
  1020 000006A0 81E3FF000000            	and	ebx, 0FFh
  1021 000006A6 4B                      	dec     ebx
  1022 000006A7 01DB                    	add     ebx, ebx
  1023 000006A9 668B83[1E150000]        	mov     ax, [ModInfo.SampVol+ebx]
  1024 000006B0 88470E                  	mov     [edi+TrackInfo.Volume], al
  1025 000006B3 668B83[E8130000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1026 000006BA 668907                  	mov     [edi+TrackInfo.Samples], ax
  1027 000006BD 668B83[26140000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1028 000006C4 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1029 000006C8 668B83[64140000]        	mov     ax, [ModInfo.SampLen+ebx]
  1030 000006CF 66894708                	mov     [edi+TrackInfo.Len], ax
  1031 000006D3 668B83[A2140000]        	mov     ax, [ModInfo.SampRep+ebx]
  1032 000006DA 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1033 000006DE 668B83[E0140000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1034 000006E5 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1035                                  SetPeriod:      
  1036 000006E9 6685C9                  	test    cx, cx
  1037 000006EC 7424                    	jz      short SetEffect
  1038                                  
  1039 000006EE 66894F16                	mov     [edi+TrackInfo.PortTo], cx
  1040 000006F2 80FE03                  	cmp     dh, 03h
  1041 000006F5 741B                    	je      short SetEffect
  1042                                  
  1043 000006F7 66894F10                	mov     [edi+TrackInfo.Period], cx
  1044 000006FB 6689CB                  	mov     bx, cx
  1045 000006FE 6601DB                  	add     bx, bx
  1046 00000701 66678B87[5C15]          	mov     ax, [PitchTable+bx]
  1047 00000707 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1048 0000070B C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1049                                  SetEffect:
  1050 00000712 6685D2                  	test    dx, dx
  1051 00000715 7430                    	jz      short InitNone
  1052 00000717 80FE00                  	cmp     dh, 00h
  1053 0000071A 0F84E5000000            	je      InitArpeggio
  1054 00000720 80FE03                  	cmp     dh, 03h
  1055 00000723 7423                    	je      short InitTonePort
  1056 00000725 80FE04                  	cmp     dh, 04h
  1057 00000728 742D                    	je      short InitVibrato
  1058 0000072A 80FE09                  	cmp     dh, 09h
  1059 0000072D 7451                    	je      short SampleOfs
  1060 0000072F 80FE0B                  	cmp     dh, 0Bh
  1061 00000732 7462                    	je      short PosJump
  1062 00000734 80FE0C                  	cmp     dh, 0Ch
  1063 00000737 746B                    	je      short SetVolume
  1064 00000739 80FE0D                  	cmp     dh, 0Dh
  1065 0000073C 7471                    	je      short Break
  1066 0000073E 80FE0F                  	cmp     dh, 0Fh
  1067 00000741 0F8487000000            	je      SetSpeed
  1068                                  InitNone:
  1069 00000747 C3                      	retn
  1070                                  InitTonePort:
  1071 00000748 84D2                    	test    dl, dl
  1072 0000074A 7503                    	jnz     short SetPortParm
  1073 0000074C 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
  1074                                  SetPortParm:    
  1075 0000074F 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1076 00000752 66895714                	mov     [edi+TrackInfo.Effect], dx
  1077 00000756 C3                      	retn
  1078                                  InitVibrato:
  1079 00000757 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1080 0000075A 88C4                    	mov     ah, al
  1081 0000075C 240F                    	and     al, 0Fh
  1082 0000075E 80E4F0                  	and     ah, 0F0h
  1083 00000761 F6C20F                  	test    dl, 0Fh
  1084 00000764 7502                    	jne     short OkDepth
  1085 00000766 08C2                    	or      dl, al
  1086                                  OkDepth:        
  1087 00000768 F6C2F0                  	test    dl, 0F0h
  1088 0000076B 7502                    	jnz     short OkRate
  1089 0000076D 08E2                    	or      dl, ah
  1090                                  OkRate:         
  1091 0000076F 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1092 00000772 66895714                	mov     [edi+TrackInfo.Effect], dx
  1093 00000776 6685C9                  	test    cx, cx
  1094 00000779 7404                    	jz      short OkPos
  1095 0000077B C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1096                                  OkPos:          
  1097 0000077F C3                      	retn
  1098                                  SampleOfs:      
  1099 00000780 84D2                    	test    dl, dl
  1100 00000782 7503                    	jnz     short SetSampleOfs
  1101 00000784 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
  1102                                  SetSampleOfs:
  1103 00000787 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
  1104 0000078A 88D6                    	mov     dh, dl
  1105 0000078C 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1106 00000792 895704                  	mov     [edi+TrackInfo.Position], edx
  1107 00000795 C3                      	retn
  1108                                  PosJump:
  1109 00000796 8815[0E6D0000]          	mov     [OrderPos], dl
  1110 0000079C C605[126D0000]40        	mov     byte [Row], 64
  1111 000007A3 C3                      	retn
  1112                                  SetVolume:
  1113 000007A4 80FA40                  	cmp     dl, 64
  1114 000007A7 7602                    	jbe     short OkVol
  1115 000007A9 B240                    	mov     dl, 64
  1116                                  OkVol:
  1117 000007AB 88570E                  	mov     [edi+TrackInfo.Volume], dl
  1118 000007AE C3                      	retn
  1119                                  Break:
  1120 000007AF 88D6                    	mov     dh, dl
  1121 000007B1 80E20F                  	and     dl, 0Fh
  1122 000007B4 C0EE04                  	shr     dh, 4
  1123 000007B7 00F6                    	add     dh, dh
  1124 000007B9 00F2                    	add     dl, dh
  1125 000007BB C0E602                  	shl     dh, 2
  1126 000007BE 00F2                    	add     dl, dh
  1127 000007C0 8815[136D0000]          	mov     [BreakRow], dl
  1128 000007C6 C605[126D0000]40        	mov     byte [Row], 64
  1129 000007CD C3                      	retn
  1130                                  SetSpeed:
  1131 000007CE 84D2                    	test    dl,dl
  1132 000007D0 7432                    	je      Skip
  1133 000007D2 80FA1F                  	cmp     dl,31
  1134 000007D5 770D                    	ja      short SetBpm
  1135                                  SetTempo:       
  1136 000007D7 8815[0F6D0000]          	mov     [Tempo], dl
  1137 000007DD 8815[106D0000]          	mov     [TempoWait], dl
  1138 000007E3 C3                      	retn
  1139                                  SetBpm:
  1140 000007E4 8815[116D0000]          	mov     [Bpm], dl
  1141 000007EA B067                    	mov     al, 103
  1142 000007EC F6E2                    	mul     dl
  1143 000007EE 88E3                    	mov     bl, ah
  1144 000007F0 30FF                    	xor     bh, bh
  1145 000007F2 66A1[650E0000]          	mov     ax, [MixSpeed]
  1146 000007F8 6631D2                  	xor     dx, dx
  1147 000007FB 66F7F3                  	div     bx
  1148 000007FE 66A3[146D0000]          	mov     [BpmSamples], ax
  1149                                  Skip:           
  1150 00000804 C3                      	retn
  1151                                  InitArpeggio:
  1152 00000805 88D6                    	mov     dh, dl
  1153 00000807 80E20F                  	and     dl, 0Fh
  1154 0000080A C0EE04                  	shr     dh, 4
  1155 0000080D 66B92400                	mov     cx, 36
  1156 00000811 31DB                    	xor     ebx, ebx
  1157 00000813 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1158                                  gt_ScanPeriod:
  1159 00000817 66673B87[1B0E]          	cmp     ax, [PeriodTable+bx]
  1160 0000081D 7306                    	jae     short SetArp
  1161 0000081F 6683C302                	add     bx, 2
  1162 00000823 E2F2                    	loop    gt_ScanPeriod
  1163                                  SetArp:         
  1164 00000825 6601D2                  	add     dx, dx
  1165 00000828 00DE                    	add     dh, bl
  1166 0000082A 00DA                    	add     dl, bl
  1167 0000082C 66678B9F[1B0E]          	mov     bx, [PeriodTable+bx]
  1168 00000832 6601DB                  	add     bx, bx
  1169 00000835 66678B87[5C15]          	mov     ax, [PitchTable+bx]
  1170 0000083B 6689471C                	mov     [edi+TrackInfo.Arp], ax
  1171 0000083F 88F3                    	mov     bl, dh
  1172 00000841 30FF                    	xor     bh, bh
  1173 00000843 66678B9F[1B0E]          	mov     bx, [PeriodTable+bx]
  1174 00000849 6601DB                  	add     bx, bx
  1175 0000084C 66678B87[5C15]          	mov     ax, [PitchTable+bx]
  1176 00000852 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
  1177 00000856 88D3                    	mov     bl, dl
  1178 00000858 30FF                    	xor     bh, bh
  1179 0000085A 66678B9F[1B0E]          	mov     bx, [PeriodTable+bx]
  1180 00000860 6601DB                  	add     bx, bx
  1181 00000863 66678B87[5C15]          	mov     ax, [PitchTable+bx]
  1182 00000869 66894720                	mov     [edi+TrackInfo.Arp+4], ax
  1183 0000086D 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1184 00000873 C3                      	retn
  1185                                  
  1186                                  ;--------------------------------------------------------------------------
  1187                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1188                                  ;--------------------------------------------------------------------------
  1189                                  
  1190                                  UpdateTracks:
  1191 00000874 FE0D[106D0000]          	dec     byte [TempoWait]
  1192 0000087A 7415                    	jz      short GetTracks
  1193                                  
  1194 0000087C B904000000              	mov	ecx, NumTracks
  1195 00000881 BF[246D0000]            	mov	edi, Tracks
  1196                                  BeatTracks:
  1197 00000886 E87AFCFFFF              	call	BeatTrack	
  1198 0000088B 83C724                  	add	edi, TrackInfo.size
  1199 0000088E E2F6                    	loop	BeatTracks
  1200 00000890 C3                      	retn
  1201                                  GetTracks:
  1202 00000891 A0[0F6D0000]            	mov     al, [Tempo]
  1203 00000896 A2[106D0000]            	mov     [TempoWait], al
  1204                                  
  1205 0000089B 8B35[206D0000]          	mov	esi, [Note]
  1206 000008A1 803D[126D0000]40        	cmp     byte [Row], 64
  1207 000008A8 7263                    	jb      short NoPattWrap
  1208                                  
  1209 000008AA 8B35[E4130000]          	mov	esi, [ModInfo.Patterns]
  1210 000008B0 8A1D[0E6D0000]          	mov     bl, [OrderPos]
  1211 000008B6 3A1D[62130000]          	cmp     bl, [ModInfo.OrderLen]
  1212 000008BC 7214                    	jb      short NoOrderWrap
  1213 000008BE 8A1D[63130000]          	mov     bl, [ModInfo.ReStart]
  1214 000008C4 881D[0E6D0000]          	mov     [OrderPos], bl
  1215 000008CA 3A1D[62130000]          	cmp     bl, [ModInfo.OrderLen]
  1216 000008D0 735D                    	jae     short NoUpdate
  1217                                  NoOrderWrap:    
  1218                                  	;xor	bh, bh
  1219 000008D2 81E3FF000000            	and	ebx, 0FFh
  1220 000008D8 8A9B[64130000]          	mov     bl, [ModInfo.Order+ebx]
  1221 000008DE C1E30A                  	shl     ebx, 10 ; *1024
  1222 000008E1 01DE                    	add     esi, ebx
  1223 000008E3 8A1D[136D0000]          	mov     bl, [BreakRow]
  1224 000008E9 881D[126D0000]          	mov     [Row], bl
  1225                                  	;xor     bh, bh
  1226 000008EF 81E3FF000000            	and	ebx, 0FFh
  1227 000008F5 883D[136D0000]          	mov     [BreakRow], bh ; 0
  1228 000008FB 66C1E304                	shl     bx, 4
  1229 000008FF 01DE                    	add     esi, ebx
  1230 00000901 8935[206D0000]          	mov     [Note], esi
  1231 00000907 FE05[0E6D0000]          	inc     byte [OrderPos]
  1232                                  NoPattWrap:     
  1233 0000090D FE05[126D0000]          	inc     byte [Row]
  1234                                  
  1235                                  	;cld
  1236 00000913 B904000000              	mov	ecx, NumTracks
  1237 00000918 BF[246D0000]            	mov	edi, Tracks
  1238                                  GetTracks_next:
  1239 0000091D 51                      	push	ecx	
  1240 0000091E E857FDFFFF              	call	GetTrack
  1241 00000923 59                      	pop	ecx
  1242 00000924 83C724                  	add	edi, TrackInfo.size
  1243 00000927 E2F4                    	loop	GetTracks_next
  1244                                  
  1245 00000929 8935[206D0000]          	mov     [Note], esi
  1246                                  NoUpdate:
  1247 0000092F C3                      	retn
  1248                                  
  1249                                  ;--------------------------------------------------------------------------
  1250                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1251                                  ;  In:
  1252                                  ;   ds:si -  Track Info Address.
  1253                                  ;   ds:di -  Buffer Address.
  1254                                  ;    cx   -  Buffer Size.
  1255                                  ;--------------------------------------------------------------------------
  1256                                  
  1257                                  ; esi = Track info address
  1258                                  ; edi = Buffer address
  1259                                  ; ecx = Buffer size
  1260                                  
  1261                                  MixTrack:
  1262 00000930 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1263 00000935 7748                    	ja      short MixLooped
  1264                                  MixNonLooped:   
  1265 00000937 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1266 00000939 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1267 0000093C 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1268 00000940 52                      	push    edx
  1269 00000941 56                      	push    esi
  1270 00000942 01D3                    	add     ebx, edx
  1271 00000944 01D5                    	add     ebp, edx
  1272 00000946 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1273 0000094A 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1274 0000094D 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1275 00000950 89DE                    	mov     esi, ebx
  1276 00000952 88C7                    	mov     bh, al
  1277 00000954 88D0                    	mov     al, dl
  1278 00000956 88F2                    	mov     dl, dh
  1279                                  	;xor	dh, dh
  1280 00000958 81E2FF000000            	and	edx, 0FFh
  1281                                  nlMixSamp:      
  1282 0000095E 39EE                    	cmp     esi, ebp
  1283 00000960 7310                    	jae     short nlMixBye
  1284 00000962 8A1E                    	mov     bl, [esi]
  1285 00000964 678A9F[0E1C]            	mov     bl, [VolTable+bx]
  1286 00000969 001F                    	add     [edi], bl
  1287 0000096B 47                      	inc     edi
  1288 0000096C 00C4                    	add     ah, al
  1289 0000096E 11D6                    	adc     esi, edx
  1290 00000970 E2EC                    	loop    nlMixSamp
  1291                                  nlMixBye:       
  1292 00000972 89F3                    	mov     ebx, esi
  1293 00000974 5E                      	pop     esi
  1294 00000975 5A                      	pop     edx
  1295 00000976 29D3                    	sub     ebx, edx
  1296 00000978 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1297 0000097B 88660F                  	mov     [esi+TrackInfo.Error], ah
  1298 0000097E C3                      	retn
  1299                                  MixLooped:
  1300 0000097F 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1301 00000981 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1302 00000984 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1303 00000988 892D[1C6D0000]          	mov     [BufRep], ebp
  1304                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1305 0000098E 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1306 00000992 52                      	push    edx
  1307 00000993 56                      	push    esi
  1308 00000994 01D3                    	add     ebx, edx
  1309 00000996 01D5                    	add     ebp, edx
  1310 00000998 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1311 0000099C 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1312 0000099F 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1313                                  	;mov    si, bx
  1314 000009A2 89DE                    	mov	esi, ebx ; 04/09/2017
  1315 000009A4 88C7                    	mov     bh, al
  1316 000009A6 88D0                    	mov     al, dl
  1317 000009A8 88F2                    	mov     dl, dh
  1318                                  	;xor	dh, dh
  1319 000009AA 81E2FF000000            	and	edx, 0FFh
  1320                                  lpMixSamp:      
  1321 000009B0 39EE                    	cmp     esi, ebp
  1322 000009B2 7206                    	jb      short lpMixNow
  1323 000009B4 2B35[1C6D0000]          	sub     esi, [BufRep]
  1324                                  lpMixNow:       
  1325 000009BA 8A1E                    	mov     bl, [esi]
  1326 000009BC 678A9F[0E1C]            	mov     bl, [VolTable+bx]
  1327 000009C1 001F                    	add     [edi], bl
  1328 000009C3 47                      	inc     edi
  1329 000009C4 00C4                    	add     ah, al
  1330 000009C6 11D6                    	adc	esi, edx
  1331 000009C8 E2E6                    	loop    lpMixSamp
  1332                                  lpMixBye:       
  1333                                  ;	mov     ebx, esi
  1334                                  ;	pop     esi
  1335                                  ;	pop     edx
  1336                                  ;	sub     ebx, edx
  1337                                  ;	mov     [esi+TrackInfo.Position], ebx
  1338                                  ;	mov     [esi+TrackInfo.Error], ah
  1339                                  ;	retn
  1340 000009CA EBA6                    	jmp	short nlMixBye
  1341                                  
  1342                                  ;--------------------------------------------------------------------------
  1343                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1344                                  ;  In:
  1345                                  ;    Buffer  - Buffer Address.
  1346                                  ;    Count   - Buffer Size.
  1347                                  ;--------------------------------------------------------------------------
  1348                                  
  1349                                  GetSamples:
  1350                                  	; edi = buffer address
  1351                                  	; ebx = count
  1352                                  
  1353 000009CC 60                      	pushad
  1354                                  
  1355                                  	;cld
  1356                                  NextChunk:      
  1357 000009CD 66833D[1A6D0000]00      	cmp     word [BufLen], 0
  1358 000009D5 7548                    	jne     short CopyChunk
  1359                                  
  1360 000009D7 53                      	push    ebx
  1361 000009D8 57                      	push    edi
  1362                                  MixChunk:       
  1363 000009D9 BF[0E5D0000]            	mov	edi, MixBuffer
  1364 000009DE 0FB70D[146D0000]        	movzx	ecx, word [BpmSamples]
  1365 000009E5 893D[166D0000]          	mov     [BufPtr], edi
  1366 000009EB 66890D[1A6D0000]        	mov     [BufLen], cx
  1367                                  
  1368 000009F2 B080                    	mov     al, 80h
  1369 000009F4 F3AA                    	rep     stosb
  1370                                  
  1371 000009F6 66B90400                	mov	cx, NumTracks
  1372 000009FA BE[006D0000]            	mov	esi, Tracks - TrackInfo.size
  1373                                  GetSamples_next:
  1374 000009FF 51                      	push	ecx
  1375 00000A00 83C624                  	add	esi, TrackInfo.size
  1376 00000A03 668B0D[1A6D0000]        	mov	cx, [BufLen]
  1377 00000A0A 8B3D[166D0000]          	mov	edi, [BufPtr]
  1378 00000A10 E81BFFFFFF              	call	MixTrack
  1379 00000A15 59                      	pop	ecx
  1380 00000A16 E2E7                    	loop	GetSamples_next	
  1381                                  
  1382 00000A18 E857FEFFFF              	call    UpdateTracks
  1383                                  
  1384 00000A1D 5F                      	pop     edi
  1385 00000A1E 5B                      	pop     ebx
  1386                                  CopyChunk:      
  1387                                  	;mov	cx, [BufLen]
  1388 00000A1F 0FB70D[1A6D0000]        	movzx	ecx, word [BufLen]
  1389 00000A26 39D9                    	cmp	ecx, ebx
  1390                                  	;cmp	cx, bx
  1391 00000A28 7602                    	jbe     short MoveChunk
  1392                                  	;mov	cx, bx
  1393 00000A2A 89D9                    	mov     ecx, ebx
  1394                                  MoveChunk:
  1395 00000A2C 8B35[166D0000]          	mov     esi, [BufPtr]
  1396 00000A32 010D[166D0000]          	add     [BufPtr], ecx
  1397 00000A38 66290D[1A6D0000]        	sub     [BufLen], cx
  1398 00000A3F 29CB                    	sub     ebx, ecx
  1399 00000A41 F3A4                    	rep     movsb
  1400 00000A43 85DB                    	test    ebx, ebx
  1401 00000A45 7586                    	jnz     short NextChunk
  1402                                  
  1403 00000A47 61                      	popad
  1404 00000A48 C3                      	retn
  1405                                  
  1406                                  ;--------------------------------------------------------------------------
  1407                                  ; StartPlaying: Initializes the Sound System.
  1408                                  ;  In:
  1409                                  ;   Module Information Resources.
  1410                                  ;--------------------------------------------------------------------------
  1411                                  
  1412                                  StartPlaying:
  1413 00000A49 60                      	pushad
  1414                                  SetModParms:    
  1415 00000A4A C605[0E6D0000]00        	mov     byte [OrderPos], 0
  1416 00000A51 C605[0F6D0000]06        	mov     byte [Tempo], DefTempo
  1417 00000A58 C605[106D0000]06        	mov     byte [TempoWait], DefTempo
  1418 00000A5F C605[116D0000]7D        	mov     byte [Bpm], DefBpm
  1419 00000A66 C605[126D0000]40        	mov     byte [Row], 64
  1420 00000A6D C605[136D0000]00        	mov     byte [BreakRow], 0
  1421 00000A74 66A1[650E0000]          	mov     ax, [MixSpeed]
  1422 00000A7A 31D2                    	xor     edx, edx
  1423 00000A7C 66BB3200                	mov     bx, 24*DefBpm/60
  1424 00000A80 66F7F3                  	div     bx
  1425 00000A83 66A3[146D0000]          	mov     [BpmSamples], ax
  1426                                  ClearTracks:    
  1427 00000A89 BF[246D0000]            	mov     edi, Tracks
  1428 00000A8E B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1429 00000A93 31C0                    	xor     eax, eax
  1430                                  	;cld
  1431 00000A95 F3AA                    	rep     stosb
  1432                                  
  1433 00000A97 A3[166D0000]            	mov     [BufPtr], eax
  1434 00000A9C 66A3[1A6D0000]          	mov     [BufLen], ax
  1435                                  MakePitch:
  1436 00000AA2 66B80021                	mov     ax, MidCRate
  1437 00000AA6 66BBAC01                	mov     bx, 428
  1438 00000AAA 66F7E3                  	mul     bx
  1439 00000AAD 66F735[650E0000]        	div     word [MixSpeed]
  1440 00000AB4 30F6                    	xor     dh, dh
  1441 00000AB6 88E2                    	mov     dl, ah
  1442 00000AB8 88C4                    	mov     ah, al
  1443 00000ABA 30C0                    	xor     al, al
  1444 00000ABC 66B95903                	mov     cx, 857
  1445 00000AC0 31DB                    	xor     ebx, ebx
  1446 00000AC2 BF[5C150000]            	mov     edi, PitchTable
  1447                                  PitchLoop:      
  1448 00000AC7 50                      	push    eax
  1449 00000AC8 52                      	push    edx
  1450 00000AC9 6639DA                  	cmp     dx, bx
  1451 00000ACC 7303                    	jae     short NoDiv
  1452 00000ACE 66F7F3                  	div     bx
  1453                                  NoDiv:          
  1454 00000AD1 66AB                    	stosw
  1455 00000AD3 5A                      	pop     edx
  1456 00000AD4 58                      	pop     eax
  1457 00000AD5 43                      	inc     ebx
  1458 00000AD6 E2EF                    	loop    PitchLoop
  1459                                  MakeVolume:     
  1460 00000AD8 66B90041                	mov     cx, 16640
  1461 00000ADC 89CB                    	mov     ebx, ecx
  1462                                  VolLoop:
  1463 00000ADE 4B                      	dec     ebx
  1464 00000ADF 88D8                    	mov     al, bl
  1465 00000AE1 F6EF                    	imul    bh
  1466 00000AE3 88A3[0E1C0000]          	mov     [VolTable+ebx], ah
  1467 00000AE9 E2F3                    	loop    VolLoop
  1468                                  
  1469 00000AEB 61                      	popad
  1470 00000AEC C3                      	retn
  1471                                  
  1472                                  ;--------------------------------------------------------------------------
  1473                                  ; StopPlaying: ShutDown the Sound System.
  1474                                  ;--------------------------------------------------------------------------
  1475                                  
  1476                                  StopPlaying:
  1477                                  	; 19/06/2017
  1478                                  	; Stop Playing
  1479                                  	sys	_audio, 0700h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000AED BB00070000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000AF2 B820000000          <1>  mov eax, %1
    98                              <1> 
    99 00000AF7 CD40                <1>  int 40h
  1480                                  	; Cancel callback service (for user)
  1481                                  	sys	_audio, 0900h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000AF9 BB00090000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000AFE B820000000          <1>  mov eax, %1
    98                              <1> 
    99 00000B03 CD40                <1>  int 40h
  1482                                  	; Deallocate Audio Buffer (for user)
  1483                                  	sys	_audio, 0A00h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000B05 BB000A0000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000B0A B820000000          <1>  mov eax, %1
    98                              <1> 
    99 00000B0F CD40                <1>  int 40h
  1484                                  	; Disable Audio Device
  1485                                  	sys	_audio, 0C00h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000B11 BB000C0000          <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91                              <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93                              <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000B16 B820000000          <1>  mov eax, %1
    98                              <1> 
    99 00000B1B CD40                <1>  int 40h
  1486                                  
  1487 00000B1D C3                      	retn
  1488                                  
  1489                                  ; 24/06/2017
  1490                                  ;--------------------------------------------------------------------------
  1491                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1492                                  ;--------------------------------------------------------------------------
  1493                                  ; This Conversion is needed for AC'97 hardware 
  1494                                  ; which ony supports 16 bit stereo samples !
  1495                                  
  1496                                  ; source = temp_buffer (8192 bytes)
  1497                                  ; destination = Audio_Buffer (32768 bytes)
  1498                                  
  1499                                  ConvertSamples:
  1500                                  	; 24/06/2017
  1501 00000B1E B900200000              	mov	ecx, BUFFERSIZE /4  ; 8192
  1502 00000B23 BE[00800100]            	mov	esi, temp_buffer
  1503 00000B28 BF[00000100]            	mov	edi, Audio_Buffer
  1504                                  c_smpl_1:
  1505 00000B2D AC                      	lodsb	; get 8 bit mono sample
  1506 00000B2E 20C0                    	and	al, al
  1507 00000B30 7506                    	jnz	short c_smpl_2
  1508 00000B32 66B80080                	mov	ax, 8000h
  1509 00000B36 EB06                    	jmp	short c_smpl_3
  1510                                  c_smpl_2:
  1511 00000B38 2C80                    	sub	al, 80h	
  1512 00000B3A 88C4                    	mov	ah, al
  1513 00000B3C 28C0                    	sub	al, al
  1514                                  c_smpl_3:	
  1515 00000B3E 6689C2                  	mov	dx, ax
  1516 00000B41 C1E010                  	shl	eax, 16
  1517 00000B44 6689D0                  	mov	ax, dx
  1518 00000B47 AB                      	stosd	; save 16 bit stereo sample
  1519 00000B48 E2E3                    	loop 	c_smpl_1
  1520                                  	
  1521 00000B4A C3                      	retn
  1522                                  
  1523                                  ;=============================================================================
  1524                                  ; 
  1525                                  ;=============================================================================
  1526                                  
  1527                                  ;dword2str:
  1528                                  ;	; 13/11/2016 - Erdogan Tan 
  1529                                  ;	; eax = dword value
  1530                                  ;	;
  1531                                  ;	call	dwordtohex
  1532                                  ;	mov	[dword_str], edx
  1533                                  ;	mov	[dword_str+4], eax
  1534                                  ;	mov	si, dword_str
  1535                                  ;	retn
  1536                                  
  1537                                  	; 05/03/2017 (TRDOS 386)
  1538                                  	; trdos386.s (unix386.s) - 10/05/2015
  1539                                  	; Convert binary number to hexadecimal string
  1540                                  
  1541                                  ;bytetohex:
  1542                                  ;	; INPUT ->
  1543                                  ;	; 	AL = byte (binary number)
  1544                                  ;	; OUTPUT ->
  1545                                  ;	;	AX = hexadecimal string
  1546                                  ;	;
  1547                                  ;	push	ebx
  1548                                  ;	movzx	ebx, al
  1549                                  ;	shr	bl, 4
  1550                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1551                                  ;	xchg	bl, al
  1552                                  ;	and	bl, 0Fh
  1553                                  ;	mov	ah, [ebx+hex_chars] 
  1554                                  ;	pop	ebx	
  1555                                  ;	retn
  1556                                  
  1557                                  ;wordtohex:
  1558                                  ;	; INPUT ->
  1559                                  ;	; 	AX = word (binary number)
  1560                                  ;	; OUTPUT ->
  1561                                  ;	;	EAX = hexadecimal string
  1562                                  ;	;
  1563                                  ;	push	ebx
  1564                                  ;	xor	ebx, ebx
  1565                                  ;	xchg	ah, al
  1566                                  ;	push	eax
  1567                                  ;	mov	bl, ah
  1568                                  ;	shr	bl, 4
  1569                                  ;	mov	al, [ebx+hex_chars] 	 	
  1570                                  ;	mov	bl, ah
  1571                                  ;	and	bl, 0Fh
  1572                                  ;	mov	ah, [ebx+hex_chars]
  1573                                  ;	shl	eax, 16
  1574                                  ;	pop	eax
  1575                                  ;	pop	ebx
  1576                                  ;	jmp	short bytetohex
  1577                                  
  1578                                  ;dwordtohex:
  1579                                  ;	; INPUT ->
  1580                                  ;	; 	EAX = dword (binary number)
  1581                                  ;	; OUTPUT ->
  1582                                  ;	;	EDX:EAX = hexadecimal string
  1583                                  ;	;
  1584                                  ;	push	eax
  1585                                  ;	shr	eax, 16
  1586                                  ;	call	wordtohex
  1587                                  ;	mov	edx, eax
  1588                                  ;	pop	eax
  1589                                  ;	call	wordtohex
  1590                                  ;	retn
  1591                                  
  1592                                  	; 24/06/2017
  1593                                  	; 19/06/2017
  1594                                  	; 05/03/2017 (TRDOS 386)
  1595                                  	; 13/11/2016 - Erdogan Tan
  1596                                  write_audio_dev_info:
  1597                                  	; BUS/DEV/FN
  1598                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1599                                  	; DEV/VENDOR
  1600                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1601                                  
  1602 00000B4B 8B35[100F0000]          	mov	esi, [dev_vendor]
  1603 00000B51 6689F0                  	mov	ax, si
  1604 00000B54 0FB6D8                  	movzx	ebx, al
  1605 00000B57 88DA                    	mov	dl, bl
  1606 00000B59 80E30F                  	and	bl, 0Fh
  1607 00000B5C 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1608 00000B62 A2[AC0E0000]            	mov	[msgVendorId+3], al
  1609 00000B67 88D3                    	mov	bl, dl
  1610 00000B69 C0EB04                  	shr	bl, 4
  1611 00000B6C 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1612 00000B72 A2[AB0E0000]            	mov	[msgVendorId+2], al
  1613 00000B77 88E3                    	mov	bl, ah
  1614 00000B79 88DA                    	mov	dl, bl
  1615 00000B7B 80E30F                  	and	bl, 0Fh
  1616 00000B7E 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1617 00000B84 A2[AA0E0000]            	mov	[msgVendorId+1], al
  1618 00000B89 88D3                    	mov	bl, dl
  1619 00000B8B C0EB04                  	shr	bl, 4
  1620 00000B8E 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1621 00000B94 A2[A90E0000]            	mov	[msgVendorId], al
  1622 00000B99 C1EE10                  	shr	esi, 16
  1623 00000B9C 6689F0                  	mov	ax, si
  1624 00000B9F 88C3                    	mov	bl, al
  1625 00000BA1 88DA                    	mov	dl, bl
  1626 00000BA3 80E30F                  	and	bl, 0Fh
  1627 00000BA6 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1628 00000BAC A2[BD0E0000]            	mov	[msgDevId+3], al
  1629 00000BB1 88D3                    	mov	bl, dl
  1630 00000BB3 C0EB04                  	shr	bl, 4
  1631 00000BB6 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1632 00000BBC A2[BC0E0000]            	mov	[msgDevId+2], al
  1633 00000BC1 88E3                    	mov	bl, ah
  1634 00000BC3 88DA                    	mov	dl, bl
  1635 00000BC5 80E30F                  	and	bl, 0Fh
  1636 00000BC8 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1637 00000BCE A2[BB0E0000]            	mov	[msgDevId+1], al
  1638 00000BD3 88D3                    	mov	bl, dl
  1639 00000BD5 C0EB04                  	shr	bl, 4
  1640 00000BD8 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1641 00000BDE A2[BA0E0000]            	mov	[msgDevId], al
  1642                                  
  1643 00000BE3 8B35[140F0000]          	mov	esi, [bus_dev_fn]
  1644 00000BE9 C1EE08                  	shr	esi, 8
  1645 00000BEC 6689F0                  	mov	ax, si
  1646 00000BEF 88C3                    	mov	bl, al
  1647 00000BF1 88DA                    	mov	dl, bl
  1648 00000BF3 80E307                  	and	bl, 7 ; bit 0,1,2
  1649 00000BF6 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1650 00000BFC A2[E10E0000]            	mov	[msgFncNo+1], al
  1651 00000C01 88D3                    	mov	bl, dl
  1652 00000C03 C0EB03                  	shr	bl, 3
  1653 00000C06 88DA                    	mov	dl, bl
  1654 00000C08 80E30F                  	and	bl, 0Fh
  1655 00000C0B 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1656 00000C11 A2[D30E0000]            	mov	[msgDevNo+1], al
  1657 00000C16 88D3                    	mov	bl, dl
  1658 00000C18 C0EB04                  	shr	bl, 4
  1659 00000C1B 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1660 00000C21 A2[D20E0000]            	mov	[msgDevNo], al
  1661 00000C26 88E3                    	mov	bl, ah
  1662 00000C28 88DA                    	mov	dl, bl
  1663 00000C2A 80E30F                  	and	bl, 0Fh
  1664 00000C2D 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1665 00000C33 A2[C70E0000]            	mov	[msgBusNo+1], al
  1666 00000C38 88D3                    	mov	bl, dl
  1667 00000C3A C0EB04                  	shr	bl, 4
  1668 00000C3D 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1669 00000C43 A2[C60E0000]            	mov	[msgBusNo], al
  1670                                  
  1671                                  	; 24/06/2017
  1672 00000C48 66A1[1C0F0000]          	mov	ax, [ac97_NamBar]
  1673 00000C4E 88C3                    	mov	bl, al
  1674 00000C50 88DA                    	mov	dl, bl
  1675 00000C52 80E30F                  	and	bl, 0Fh
  1676 00000C55 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1677 00000C5B A2[F00E0000]            	mov	[msgNamBar+3], al
  1678 00000C60 88D3                    	mov	bl, dl
  1679 00000C62 C0EB04                  	shr	bl, 4
  1680 00000C65 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1681 00000C6B A2[EF0E0000]            	mov	[msgNamBar+2], al
  1682 00000C70 88E3                    	mov	bl, ah
  1683 00000C72 88DA                    	mov	dl, bl
  1684 00000C74 80E30F                  	and	bl, 0Fh
  1685 00000C77 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1686 00000C7D A2[EE0E0000]            	mov	[msgNamBar+1], al
  1687 00000C82 88D3                    	mov	bl, dl
  1688 00000C84 C0EB04                  	shr	bl, 4
  1689 00000C87 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1690 00000C8D A2[ED0E0000]            	mov	[msgNamBar], al
  1691                                  
  1692 00000C92 66A1[1E0F0000]          	mov	ax, [ac97_NabmBar]
  1693 00000C98 88C3                    	mov	bl, al
  1694 00000C9A 88DA                    	mov	dl, bl
  1695 00000C9C 80E30F                  	and	bl, 0Fh
  1696 00000C9F 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1697 00000CA5 A2[000F0000]            	mov	[msgNabmBar+3], al
  1698 00000CAA 88D3                    	mov	bl, dl
  1699 00000CAC C0EB04                  	shr	bl, 4
  1700 00000CAF 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1701 00000CB5 A2[FF0E0000]            	mov	[msgNabmBar+2], al
  1702 00000CBA 88E3                    	mov	bl, ah
  1703 00000CBC 88DA                    	mov	dl, bl
  1704 00000CBE 80E30F                  	and	bl, 0Fh
  1705 00000CC1 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1706 00000CC7 A2[FE0E0000]            	mov	[msgNabmBar+1], al
  1707 00000CCC 88D3                    	mov	bl, dl
  1708 00000CCE C0EB04                  	shr	bl, 4
  1709 00000CD1 8A83[670E0000]          	mov	al, [ebx+hex_chars]
  1710 00000CD7 A2[FD0E0000]            	mov	[msgNabmBar], al
  1711                                  
  1712                                  	; 24/11/2016
  1713 00000CDC 30E4                    	xor	ah, ah
  1714 00000CDE A0[200F0000]            	mov	al, [ac97_int_ln_reg]
  1715 00000CE3 B10A                    	mov	cl, 10
  1716 00000CE5 F6F1                    	div	cl
  1717 00000CE7 660105[090F0000]        	add	[msgIRQ], ax
  1718 00000CEE 20C0                    	and	al, al
  1719 00000CF0 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1720 00000CF2 A0[0A0F0000]            	mov	al, [msgIRQ+1]
  1721 00000CF7 B420                    	mov	ah, ' '
  1722 00000CF9 66A3[090F0000]          	mov	[msgIRQ], ax
  1723                                  _w_ac97imsg_:
  1724                                  	; EBX = Message address
  1725                                  	; ECX = Max. message length (or stop on ZERO character)
  1726                                  	;	(1 to 255)
  1727                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1728                                       	sys 	_msg, msgAC97Info, 255, 07h
    84                              <1> 
    85                              <1> 
    86                              <1> 
    87                              <1> 
    88                              <1>  %if %0 >= 2
    89 00000CFF BB[780E0000]        <1>  mov ebx, %2
    90                              <1>  %if %0 >= 3
    91 00000D04 B9FF000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    93 00000D09 BA07000000          <1>  mov edx, %4
    94                              <1>  %endif
    95                              <1>  %endif
    96                              <1>  %endif
    97 00000D0E B823000000          <1>  mov eax, %1
    98                              <1> 
    99 00000D13 CD40                <1>  int 40h
  1729 00000D15 C3                              retn
  1730                                  
  1731                                  ;=============================================================================
  1732                                  ;               preinitialized data
  1733                                  ;=============================================================================
  1734                                  
  1735                                  ;=============================================================================
  1736                                  ;               PLAY.ASM - DATA
  1737                                  ;=============================================================================
  1738                                  
  1739                                  msg_2017:
  1740 00000D16 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1740 00000D1F 506C6179657220666F-
  1740 00000D28 72205452444F532033-
  1740 00000D31 383620627920457264-
  1740 00000D3A 6F67616E2054616E2E-
  1740 00000D43 20                 
  1741                                  	;;db	'October 2017.',10,13
  1742                                  	;db	'June 2024.',10,13
  1743 00000D44 446563656D62657220-     	db	'December 2024',10,13
  1743 00000D4D 323032340A0D       
  1744 00000D53 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1744 00000D5C 64706C61792066696C-
  1744 00000D65 656E616D652E6D6F64-
  1744 00000D6E 0A0D00             
  1745 00000D71 30382F31302F323031-     	db	'08/10/2017',10,13,0
  1745 00000D7A 370A0D00           
  1746                                  	;db	'02/06/2024',10,13,0
  1747 00000D7E 32372F31322F323032-     	db	'27/12/2024',10/13,0
  1747 00000D87 340000             
  1748                                  
  1749 00000D8A 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1749 00000D93 506C61796572207630-
  1749 00000D9C 2E3162206279204361-
  1749 00000DA5 726C6F732048617361-
  1749 00000DAE 6E2E204A756C792031-
  1749 00000DB7 3939332E           
  1750 00000DBB 0A0D00                  		db	10,13,0
  1751 00000DBE 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1751 00000DC7 64696E67204D6F6475-
  1751 00000DD0 6C652066696C652E0A-
  1751 00000DD9 0D00               
  1752                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1753                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1754                                  ;PortText:	db	'x0h, IRQ '
  1755                                  ;IrqText:	db	'x.',10,13,0
  1756                                  
  1757                                  trdos386_err_msg:
  1758 00000DDB 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1758 00000DE4 2053797374656D2063-
  1758 00000DED 616C6C206572726F72-
  1758 00000DF6 20210A0D00         
  1759                                  
  1760                                  ;=============================================================================
  1761                                  ;               MODPLAY.ASM - DATA
  1762                                  ;=============================================================================
  1763                                  
  1764                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1765                                  
  1766 00000DFB 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1766 00000E04 C5D4E1             
  1767 00000E07 ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1767 00000E10 E1                 
  1768 00000E11 D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1768 00000E1A 19                 
  1769                                  
  1770 00000E1B 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1770 00000E24 0280025C023A021A02-
  1770 00000E2D FC01E001C501       
  1771 00000E33 AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1771 00000E3C 0140012E011D010D01-
  1771 00000E45 FE00F000E200       
  1772 00000E4B D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1772 00000E54 00A00097008F008700-
  1772 00000E5D 7F0078007100       
  1773                                  
  1774                                  ;=============================================================================
  1775                                  ;               PLAYER.ASM - DATA
  1776                                  ;=============================================================================
  1777                                  
  1778 00000E63 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1779 00000E64 08                      bps:		db 8 ; bits per sample (8 or 16)
  1780                                  Sample_Rate:
  1781                                  MixSpeed:	;dw 22050 ; Hz
  1782                                  		; 02/06/2024
  1783 00000E65 80BB                    		dw 48000  ; Hz	
  1784                                  
  1785                                  ; 13/11/2016
  1786 00000E67 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1786 00000E70 3941424344454600   
  1787                                  ;
  1788                                  msgAC97Info:	
  1789 00000E78 0D0A                    		db 0Dh, 0Ah
  1790 00000E7A 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1790 00000E83 6F20436F6E74726F6C-
  1790 00000E8C 6C6572202620436F64-
  1790 00000E95 656320496E666F0D0A 
  1791 00000E9E 56656E646F72204944-     		db "Vendor ID: "
  1791 00000EA7 3A20               
  1792 00000EA9 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1792 00000EB2 6963652049443A20   
  1793 00000EBA 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1794 00000EC1 4275733A20              		db "Bus: "
  1795 00000EC6 303068204465766963-     msgBusNo:	db "00h Device: "
  1795 00000ECF 653A20             
  1796 00000ED2 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1796 00000EDB 696F6E3A20         
  1797 00000EE0 303068                  msgFncNo	db "00h"
  1798 00000EE3 0D0A                    		db 0Dh, 0Ah
  1799 00000EE5 4E414D4241523A20        		db "NAMBAR: "
  1800 00000EED 30303030682020          msgNamBar	db "0000h  "
  1801 00000EF4 4E41424D4241523A20      		db "NABMBAR: "
  1802 00000EFD 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  1802 00000F06 513A20             
  1803 00000F09 3030                    msgIRQ:		dw 3030h
  1804 00000F0B 0D0A00                  		db 0Dh, 0Ah, 0
  1805                                  
  1806                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1807                                  ;codec_id:	   dd 0
  1808                                  ;codec_chip_id:	   dd 0
  1809                                  ;codec_vendor_ids: dw 0
  1810                                  ;codec_chip_ids:   dw 0
  1811                                  
  1812                                  ;dword_str:	dd 30303030h, 30303030h
  1813                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1814                                  
  1815                                  ;=============================================================================
  1816                                  ;        	uninitialized data
  1817                                  ;=============================================================================
  1818                                  
  1819                                  bss_start:
  1820                                  
  1821                                  ABSOLUTE bss_start
  1822                                  
  1823 00000F0E ????                    alignb 4
  1824                                  
  1825 00000F10 ????????                dev_vendor:	resd 1
  1826 00000F14 ????????                bus_dev_fn:	resd 1
  1827 00000F18 ????????                stats_cmd:	resd 1
  1828 00000F1C ????                    ac97_NamBar:	resw 1
  1829 00000F1E ????                    ac97_NabmBar:	resw 1
  1830 00000F20 ??                      ac97_int_ln_reg: resb 1
  1831 00000F21 ??                      srb:		resb 1
  1832                                  
  1833                                  ; MODLOAD.ASM
  1834 00000F22 ????????                FileHandle:	resd 1
  1835 00000F26 <res 43Ch>              Header:		resb ModHeader.size
  1836                                  
  1837                                  ; MODPLAY.ASM
  1838                                  ;MixSpeed:	resw 1
  1839                                  
  1840                                  ModInfo:
  1841 00001362 ??                      ModInfo.OrderLen:   resb 1
  1842 00001363 ??                      ModInfo.ReStart:    resb 1
  1843 00001364 <res 80h>               ModInfo.Order:	    resb 128
  1844 000013E4 ????????                ModInfo.Patterns:   resd 1
  1845                                  
  1846 000013E8 <res 3Eh>               ModInfo.SampOfs:    resw 31
  1847 00001426 <res 3Eh>               ModInfo.SampSeg:    resw 31
  1848 00001464 <res 3Eh>               ModInfo.SampLen:    resw 31
  1849 000014A2 <res 3Eh>               ModInfo.SampRep:    resw 31
  1850 000014E0 <res 3Eh>               ModInfo.SampRepLen: resw 31
  1851 0000151E <res 3Eh>               ModInfo.SampVol:    resw 31
  1852                                  
  1853                                  ; MODPLAY.ASM
  1854 0000155C <res 6B2h>              PitchTable:	resw 857
  1855 00001C0E <res 4100h>             VolTable:	resb 16640
  1856 00005D0E <res 1000h>             MixBuffer       resb MixBufSize
  1857                                  
  1858                                  ; MODPLAY.ASM
  1859 00006D0E ??                      OrderPos:	resb 1
  1860 00006D0F ??                      Tempo:		resb 1
  1861 00006D10 ??                      TempoWait:	resb 1
  1862 00006D11 ??                      Bpm:		resb 1
  1863 00006D12 ??                      Row:		resb 1
  1864 00006D13 ??                      BreakRow:	resb 1
  1865 00006D14 ????                    BpmSamples:	resw 1
  1866 00006D16 ????????                BufPtr:		resd 1
  1867 00006D1A ????                    BufLen:		resw 1
  1868 00006D1C ????????                BufRep:		resd 1
  1869 00006D20 ????????                Note:		resd 1
  1870 00006D24 <res 90h>               Tracks:		resb TrackInfo.size*NumTracks
  1871                                  
  1872 00006DB4 <res Ch>                alignb 16
  1873                                  
  1874                                  ; PLAY.ASM
  1875                                  Scope:		;resw 320
  1876 00006DC0 <res A00h>              		resd 640 ; 27/12/2024	
  1877                                  RowOfs:		;resw 256
  1878 000077C0 <res 400h>              		resd 256 ; 27/12/2024
  1879                                  
  1880                                  ; 27/12/2024
  1881 00007BC0 ????????                timerticks:	resd 1
  1882 00007BC4 ????????                LFB_ADDR:	resd 1
  1883                                  
  1884                                  mod_file_name:
  1885 00007BC8 <res 50h>               		resb 80
  1886                                  
  1887 00007C18 <res 3E8h>              alignb 4096
  1888                                  
  1889                                  g_buff:		;resb 320*4 ; 24/06/2017
  1890 00008000 <res A00h>              		resb 640*4 ; 27/12/2024
  1891                                  
  1892 00008A00 <res 7600h>             alignb 65536
  1893                                  
  1894                                  Audio_Buffer:
  1895 00010000 <res 8000h>             		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1896                                  temp_buffer:
  1897 00018000 <res 2000h>             		resb BUFFERSIZE / 4 ; 8192
  1898                                  
  1899 0001A000 <res 6000h>             alignb 65536
  1900                                  
  1901                                  file_buffer:
  1902 00020000 <res 60000h>            		resb 65536*6
  1903                                  EOF:
