     1                                  ; ****************************************************************************
     2                                  ; tinyplay.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TINYPLAY.PRG ! MOD PLAYER & VGA DEMO program ! by Erdogan TAN
     5                                  ;
     6                                  ; 03/03/2017
     7                                  ;
     8                                  ; [ Last Modification: 06/10/2017 ]
     9                                  ;
    10                                  ; Modified from 'TMODPLAY.COM' (tmodplay.asm) source code (for MSDOS)
    11                                  ; by Erdogan Tan - 01/10/2017
    12                                  ;
    13                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    14                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    15                                  ;
    16                                  ; Assembler: NASM 2.11
    17                                  ; ----------------------------------------------------------------------------
    18                                  ;	   nasm  tinyplay.s -l tinyplay.txt -o TINYPLAY.PRG	
    19                                  ; ****************************************************************************
    20                                  ; TINYPLAY.ASM by Erdogan Tan (for MSDOS) (13/02/2017)
    21                                  ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    22                                  
    23                                  ; 01/03/2017
    24                                  ; 16/10/2016
    25                                  ; 29/04/2016
    26                                  ; TRDOS 386 system calls (temporary list!)
    27                                  _ver 	equ 0
    28                                  _exit 	equ 1
    29                                  _fork 	equ 2
    30                                  _read 	equ 3
    31                                  _write	equ 4
    32                                  _open	equ 5
    33                                  _close 	equ 6
    34                                  _wait 	equ 7
    35                                  _creat 	equ 8
    36                                  _link 	equ 9
    37                                  _unlink	equ 10
    38                                  _exec	equ 11
    39                                  _chdir	equ 12
    40                                  _time 	equ 13
    41                                  _mkdir 	equ 14
    42                                  _chmod	equ 15
    43                                  _chown	equ 16
    44                                  _break	equ 17
    45                                  _stat	equ 18
    46                                  _seek	equ 19
    47                                  _tell 	equ 20
    48                                  _mount	equ 21
    49                                  _umount	equ 22
    50                                  _setuid	equ 23
    51                                  _getuid	equ 24
    52                                  _stime	equ 25
    53                                  _quit	equ 26	
    54                                  _intr	equ 27
    55                                  _fstat	equ 28
    56                                  _emt 	equ 29
    57                                  _mdate 	equ 30
    58                                  _video 	equ 31
    59                                  _audio	equ 32
    60                                  _timer	equ 33
    61                                  _sleep	equ 34
    62                                  _msg    equ 35
    63                                  _geterr	equ 36
    64                                  _fpsave	equ 37
    65                                  _pri	equ 38
    66                                  _rele	equ 39
    67                                  _fff	equ 40
    68                                  _fnf	equ 41
    69                                  _alloc	equ 42
    70                                  _dalloc equ 43
    71                                  _calbac equ 44				
    72                                  
    73                                  %macro sys 1-4
    74                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    75                                      ; 03/09/2015	
    76                                      ; 13/04/2015
    77                                      ; Retro UNIX 386 v1 system call.		
    78                                      %if %0 >= 2   
    79                                          mov ebx, %2
    80                                          %if %0 >= 3    
    81                                              mov ecx, %3
    82                                              %if %0 = 4
    83                                                 mov edx, %4   
    84                                              %endif
    85                                          %endif
    86                                      %endif
    87                                      mov eax, %1
    88                                      ;int 30h
    89                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    90                                  %endmacro
    91                                  
    92                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    93                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    94                                  
    95                                  
    96                                  ; ----------------------------------------------------------------------------
    97                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
    98                                  ;		July 14th, 1993.
    99                                  
   100                                  ;=============================================================================
   101                                  ;               PLAY.ASM
   102                                  ;=============================================================================
   103                                  
   104                                  [BITS 32]
   105                                  [org 0]
   106                                  
   107                                  Start:
   108                                  		; clear bss
   109 00000000 B9[00000800]            		mov	ecx, EOF
   110 00000005 BF[19100000]            		mov	edi, bss_start
   111 0000000A 29F9                    		sub	ecx, edi
   112 0000000C C1E902                  		shr	ecx, 2
   113                                  		;xor	eax, eax
   114 0000000F F3AB                    		rep	stosd
   115                                  
   116                                  GetFileName:  
   117 00000011 89E6                    		mov	esi, esp
   118 00000013 AD                      		lodsd
   119 00000014 83F802                  		cmp	eax, 2 ; two arguments 
   120                                  			       ; (program file name & mod file name)
   121 00000017 0F820A020000            		jb	pmsg_usage ; nothing to do
   122                                  
   123 0000001D AD                      		lodsd ; program file name address 
   124 0000001E AD                      		lodsd ; mod file name address (file to be read)
   125 0000001F 89C6                    		mov	esi, eax
   126 00000021 BF[74830000]            		mov	edi, mod_file_name
   127                                  ScanName:       
   128 00000026 AC                      		lodsb
   129 00000027 84C0                    		test	al, al
   130 00000029 0F84F8010000            		je	pmsg_usage
   131 0000002F 3C20                    		cmp	al, 20h
   132 00000031 74F3                    		je	short ScanName		; scan start of name.
   133 00000033 AA                      		stosb
   134 00000034 B4FF                    		mov	ah, 0FFh
   135                                  a_0:	
   136 00000036 FEC4                    		inc	ah
   137                                  a_1:
   138 00000038 AC                      		lodsb
   139 00000039 AA                      		stosb
   140 0000003A 3C2E                    		cmp	al, '.'
   141 0000003C 74F8                    		je	short a_0	
   142 0000003E 20C0                    		and	al, al
   143 00000040 75F6                    		jnz	short a_1
   144                                  
   145 00000042 08E4                    		or	ah, ah			; if period NOT found,
   146 00000044 750B                    		jnz	short a_2		; then add a .MOD extension.
   147                                  SetExt:
   148 00000046 4F                      		dec	edi
   149 00000047 C7072E4D4F44            		mov	dword [edi], '.MOD'
   150 0000004D C6470400                		mov	byte [edi+4], 0
   151                                  a_2:
   152                                  		; Prints the Credits Text.
   153                                  		sys	_msg, Credits, 255, 0Ch
   153                              <1> 
   153                              <1> 
   153                              <1> 
   153                              <1> 
   153                              <1>  %if %0 >= 2
   153 00000051 BB[350F0000]        <1>  mov ebx, %2
   153                              <1>  %if %0 >= 3
   153 00000056 B9FF000000          <1>  mov ecx, %3
   153                              <1>  %if %0 = 4
   153 0000005B BA0C000000          <1>  mov edx, %4
   153                              <1>  %endif
   153                              <1>  %endif
   153                              <1>  %endif
   153 00000060 B823000000          <1>  mov eax, %1
   153                              <1> 
   153 00000065 CD40                <1>  int 40h
   154                                  
   155 00000067 E8D3010000              		call    DetectSb		; Detect the SB Addr, Irq.
   156                                  LoadMod:  
   157 0000006C BF[74830000]            		mov	edi, mod_file_name
   158 00000071 E85D050000              		call    LoadModule		; Load the MODule...
   159                                  		; 06/10/2017
   160 00000076 731B                    		jnc	short PlayNow		; any error loading?
   161                                  		
   162                                  		; yes, print error and Exit.
   163                                  
   164                                  		sys	_msg, ErrorMesg, 255, 0Fh
   164                              <1> 
   164                              <1> 
   164                              <1> 
   164                              <1> 
   164                              <1>  %if %0 >= 2
   164 00000078 BB[690F0000]        <1>  mov ebx, %2
   164                              <1>  %if %0 >= 3
   164 0000007D B9FF000000          <1>  mov ecx, %3
   164                              <1>  %if %0 = 4
   164 00000082 BA0F000000          <1>  mov edx, %4
   164                              <1>  %endif
   164                              <1>  %endif
   164                              <1>  %endif
   164 00000087 B823000000          <1>  mov eax, %1
   164                              <1> 
   164 0000008C CD40                <1>  int 40h
   165                                  
   166 0000008E E988010000              		jmp     Exit
   167                                  
   168                                  PlayNow: 
   169                                  		;; DIRECT MEMORY ACCESS (for Audio DMA)
   170                                  		;; ebx = DMA buffer address (virtual, user)
   171                                  		;; ecx = buffer size (in bytes)
   172                                  		;; edx = upper limit = 16MB
   173                                  
   174                                  		;_16MB	equ 1024*1024*16	
   175                                  
   176                                  		;sys	_alloc, DoubleBuffer, DmaBufSize, _16MB 
   177                                  		;jc	short error_exit
   178                                  
   179                                  		; 12/05/2017
   180                                  		sys	_audio, 0D00h, DmaBufSize, DoubleBuffer
   180                              <1> 
   180                              <1> 
   180                              <1> 
   180                              <1> 
   180                              <1>  %if %0 >= 2
   180 00000093 BB000D0000          <1>  mov ebx, %2
   180                              <1>  %if %0 >= 3
   180 00000098 B900000100          <1>  mov ecx, %3
   180                              <1>  %if %0 = 4
   180 0000009D BA[00000100]        <1>  mov edx, %4
   180                              <1>  %endif
   180                              <1>  %endif
   180                              <1>  %endif
   180 000000A2 B820000000          <1>  mov eax, %1
   180                              <1> 
   180 000000A7 CD40                <1>  int 40h
   181 000000A9 7218                    		jc	short error_exit
   182                                  
   183 000000AB A3[40820000]            		mov	[DMA_phy_buff], eax	; physical address
   184                                  					     	; of the buffer
   185                                  						; (which is needed
   186                                  						; for DMA controller)
   187                                  
   188                                  		; DIRECT CGA MEMORY ACCESS
   189                                  		; bl = 0, bh = 4
   190                                  		; Direct access/map to CGA memory (0B8000h)
   191                                  
   192                                  		sys	_video, 0400h
   192                              <1> 
   192                              <1> 
   192                              <1> 
   192                              <1> 
   192                              <1>  %if %0 >= 2
   192 000000B0 BB00040000          <1>  mov ebx, %2
   192                              <1>  %if %0 >= 3
   192                              <1>  mov ecx, %3
   192                              <1>  %if %0 = 4
   192                              <1>  mov edx, %4
   192                              <1>  %endif
   192                              <1>  %endif
   192                              <1>  %endif
   192 000000B5 B81F000000          <1>  mov eax, %1
   192                              <1> 
   192 000000BA CD40                <1>  int 40h
   193 000000BC 3D00800B00              		cmp	eax, 0B8000h
   194 000000C1 741B                    		je	short a_3
   195                                  error_exit:
   196                                  		sys	_msg, trdos386_err_msg, 255, 0Eh
   196                              <1> 
   196                              <1> 
   196                              <1> 
   196                              <1> 
   196                              <1>  %if %0 >= 2
   196 000000C3 BB[DC0F0000]        <1>  mov ebx, %2
   196                              <1>  %if %0 >= 3
   196 000000C8 B9FF000000          <1>  mov ecx, %3
   196                              <1>  %if %0 = 4
   196 000000CD BA0E000000          <1>  mov edx, %4
   196                              <1>  %endif
   196                              <1>  %endif
   196                              <1>  %endif
   196 000000D2 B823000000          <1>  mov eax, %1
   196                              <1> 
   196 000000D7 CD40                <1>  int 40h
   197                                  		;jmp	short Exit
   198 000000D9 E93D010000              		jmp	Exit
   199                                  a_3:
   200                                  		; 02/10/2017
   201                                  		; Print "Playing..." message.
   202                                  		sys	_msg, PlayMsg, 255, 0Fh
   202                              <1> 
   202                              <1> 
   202                              <1> 
   202                              <1> 
   202                              <1>  %if %0 >= 2
   202 000000DE BB[FC0F0000]        <1>  mov ebx, %2
   202                              <1>  %if %0 >= 3
   202 000000E3 B9FF000000          <1>  mov ecx, %3
   202                              <1>  %if %0 = 4
   202 000000E8 BA0F000000          <1>  mov edx, %4
   202                              <1>  %endif
   202                              <1>  %endif
   202                              <1>  %endif
   202 000000ED B823000000          <1>  mov eax, %1
   202                              <1> 
   202 000000F2 CD40                <1>  int 40h
   203                                  		; Get current cursor position
   204 000000F4 B403                    		mov	ah, 3
   205 000000F6 B700                    		mov	bh, 0 ; Video Page 0
   206 000000F8 CD31                    		int	31h
   207                                  		; dh = row, dl = column
   208                                  		; 06/10/2017 (scroll check on next line)
   209 000000FA 80FE18                  		cmp	dh, 24 ; the last row
   210 000000FD 7202                    		jb	short set_bar_pos
   211 000000FF FECE                    		dec	dh
   212                                  set_bar_pos:
   213 00000101 B050                    		mov	al, 80
   214 00000103 F6E6                    		mul	dh
   215 00000105 30F6                    		xor	dh, dh
   216 00000107 6601D0                  		add	ax, dx
   217 0000010A 66D1E0                  		shl	ax, 1
   218 0000010D BB00800B00              		mov	ebx, 0B8000h
   219 00000112 6601C3                  		add	bx, ax
   220 00000115 891D[1C100000]          		mov	[bar_start], ebx
   221 0000011B 6683C320                		add	bx, 2*16
   222 0000011F 891D[20100000]          		mov	[bar_stop], ebx
   223                                  
   224                                  		; Print (GoTo) NextLine.
   225                                  		sys	_msg, NextLine, 3, 07h
   225                              <1> 
   225                              <1> 
   225                              <1> 
   225                              <1> 
   225                              <1>  %if %0 >= 2
   225 00000125 BB[13100000]        <1>  mov ebx, %2
   225                              <1>  %if %0 >= 3
   225 0000012A B903000000          <1>  mov ecx, %3
   225                              <1>  %if %0 = 4
   225 0000012F BA07000000          <1>  mov edx, %4
   225                              <1>  %endif
   225                              <1>  %endif
   225                              <1>  %endif
   225 00000134 B823000000          <1>  mov eax, %1
   225                              <1> 
   225 00000139 CD40                <1>  int 40h
   226                                  		;
   227                                  
   228                                  		; 11/03/2017 (22000 -> 22050)
   229 0000013B 66C705[2A100000]22-     		mov     word [MixSpeed], 22050	; Mixing at 22 kHz
   229 00000143 56                 
   230                                  
   231                                  ;		call    StartPlaying            ; PLAY!
   232                                  
   233 00000144 E8F4020000              		call    SbInit
   234                                  
   235                                  start_volume_bars:
   236                                  		;mov	byte [tLoop], 1
   237                                  MainLoop:
   238                                  		; ModPlay Polling!
   239 00000149 E8C2020000              		call    SbPoll
   240                                  
   241                                  		;cmp	byte [tLoop], 1
   242                                  		;jb	short _StopPlay
   243                                  
   244 0000014E BE[00000100]            		mov     esi, DmaBuffer		; get current samples
   245                                  						; to be drawed ...
   246                                  GetDmaCount:
   247                                  		;in	al, 03h
   248 00000153 66BA0300                		mov	dx, 03h
   249 00000157 B400                    		mov	ah, 0 ; inb
   250 00000159 CD34                    		int	34h	
   251 0000015B 88C1                    		mov	cl, al
   252                                  		;in	al, 03h
   253                                  		;mov	ah, 0 ; inb
   254 0000015D CD34                    		int	34h
   255 0000015F 88C5                    		mov     ch, al
   256                                  		; 06/10/2017
   257                                  		;mov	dx, 65535
   258 00000161 BAFFFF0000              		mov	edx, DmaBufSize - 1
   259                                  		;mov	esi, DmaBufSize - 1  ; <= 65535
   260 00000166 6629CA                  		sub	dx, cx
   261                                  		;sub	si, cx
   262                                  		;
   263 00000169 01D6                    		add	esi, edx
   264                                  DrawLoop:      
   265                                  		; 02/10/2017 
   266 0000016B 8B0D[20100000]          		mov     ecx, [bar_stop]		; get previous bar stop address
   267 00000171 8B3D[1C100000]          		mov	edi, [bar_start]
   268                                  		; 06/10/2017
   269 00000177 66B80007                		mov	ax, 0700h ; Blank
   270 0000017B 668907                  		mov	[edi], ax
   271 0000017E 29F9                    		sub	ecx, edi
   272 00000180 761E                    		jna	short check_volume
   273 00000182 89FA                    		mov	edx, edi
   274 00000184 D0E9                    		shr	cl, 1
   275 00000186 F366AB                  		rep	stosw
   276 00000189 89D7                    		mov	edi, edx
   277 0000018B 8B15[24100000]          		mov	edx, [prev_max]
   278 00000191 09D2                    		or	edx, edx
   279 00000193 740B                    		jz	short check_volume
   280 00000195 39FA                    		cmp	edx, edi
   281 00000197 7607                    		jna	short check_volume
   282 00000199 B0DB                    		mov	al, 0DBh ; 219 ; Block
   283 0000019B B40C                    		mov	ah, 0Ch ; Light Red
   284 0000019D 668902                  		mov	[edx], ax
   285                                  check_volume:
   286                                  		; 06/10/2017
   287 000001A0 8A06                    		mov	al, [esi]
   288 000001A2 C0E804                  		shr	al, 4 ; al = 0 to 15
   289 000001A5 742A                    		jz	short update_bar_stop
   290 000001A7 88C1                    		mov	cl, al
   291                                  draw_bar:
   292 000001A9 B0DB                    		mov	al, 0DBh ; 219 ; Block
   293 000001AB B40A                    		mov	ah, 0Ah ; Light Green
   294 000001AD F366AB                  		rep	stosw
   295 000001B0 89FA                    		mov	edx, edi
   296 000001B2 4A                      		dec	edx
   297 000001B3 4A                      		dec	edx	
   298 000001B4 3B15[24100000]          		cmp	edx, [prev_max]
   299 000001BA 7508                    		jne	short new_max_volume
   300 000001BC 890D[24100000]          		mov	[prev_max], ecx ; 0 ; *
   301                                  		;jmp	short blank_prev_max
   302 000001C2 EB0D                    		jmp	short update_bar_stop
   303                                  new_max_volume:	 
   304 000001C4 B40C                    		mov	ah, 0Ch ; Light Red
   305 000001C6 668902                  		mov	[edx], ax
   306 000001C9 8715[24100000]          		xchg	[prev_max], edx
   307                                  		;cmp	edx, [prev_max] ; ** not necessary ?!
   308                                  		;ja	short update_bar_stop ; **  not necessary ?!
   309                                  blank_prev_max:
   310 000001CF 890A                    		mov	[edx], ecx ; 0 ; *
   311                                  update_bar_stop:
   312 000001D1 893D[20100000]          		mov	[bar_stop], edi
   313                                  CheckAnyKey:
   314 000001D7 B401                    		mov     ah, 1			; any key pressed?
   315 000001D9 CD32                    		int     32h			; no, Loop.
   316 000001DB 0F8468FFFFFF            		jz	MainLoop
   317                                  
   318 000001E1 B400                    		mov     ah, 0			; flush key buffer...
   319 000001E3 CD32                    		int     32h
   320                                  
   321                                  		;call	StopPlaying		; STOP!
   322                                  
   323                                  		;mov	byte [tLoop], 0
   324                                  _StopPlay:
   325                                  		; 11/03/2017
   326 000001E5 30C0                    		xor     al, al
   327                                  		; Stop 8 bit (autoinitialized) DMA process	
   328                                  		;out	0Ch, al
   329                                  		;retn
   330 000001E7 66BA0C00                		mov	dx, 0Ch
   331 000001EB B401                    		mov	ah, 1 ;outb
   332 000001ED CD34                    		int	34h
   333                                  
   334 000001EF E8A1030000              		call	SbDone
   335                                  
   336                                  		; Deallocate DMA buffer (not necessary just before exit!)
   337                                  		sys	_dalloc, DoubleBuffer, DmaBufSize
   337                              <1> 
   337                              <1> 
   337                              <1> 
   337                              <1> 
   337                              <1>  %if %0 >= 2
   337 000001F4 BB[00000100]        <1>  mov ebx, %2
   337                              <1>  %if %0 >= 3
   337 000001F9 B900000100          <1>  mov ecx, %3
   337                              <1>  %if %0 = 4
   337                              <1>  mov edx, %4
   337                              <1>  %endif
   337                              <1>  %endif
   337                              <1>  %endif
   337 000001FE B82B000000          <1>  mov eax, %1
   337                              <1> 
   337 00000203 CD40                <1>  int 40h
   338                                  		;jc	error_exit
   339                                  
   340                                  		; 02/10/2017
   341                                  		; Print "OK." message.
   342                                  		sys	_msg, OkMsg, 255, 0Fh
   342                              <1> 
   342                              <1> 
   342                              <1> 
   342                              <1> 
   342                              <1>  %if %0 >= 2
   342 00000205 BB[10100000]        <1>  mov ebx, %2
   342                              <1>  %if %0 >= 3
   342 0000020A B9FF000000          <1>  mov ecx, %3
   342                              <1>  %if %0 = 4
   342 0000020F BA0F000000          <1>  mov edx, %4
   342                              <1>  %endif
   342                              <1>  %endif
   342                              <1>  %endif
   342 00000214 B823000000          <1>  mov eax, %1
   342                              <1> 
   342 00000219 CD40                <1>  int 40h
   343                                  Exit:           
   344 0000021B E831050000              		call    FreeModule              ; Free MODule core.
   345                                  
   346                                  		sys	_exit			; Bye!
   346                              <1> 
   346                              <1> 
   346                              <1> 
   346                              <1> 
   346                              <1>  %if %0 >= 2
   346                              <1>  mov ebx, %2
   346                              <1>  %if %0 >= 3
   346                              <1>  mov ecx, %3
   346                              <1>  %if %0 = 4
   346                              <1>  mov edx, %4
   346                              <1>  %endif
   346                              <1>  %endif
   346                              <1>  %endif
   346 00000220 B801000000          <1>  mov eax, %1
   346                              <1> 
   346 00000225 CD40                <1>  int 40h
   347                                  
   348                                  pmsg_usage:
   349                                  		sys	_msg, msg_usage, 255, 0Ah
   349                              <1> 
   349                              <1> 
   349                              <1> 
   349                              <1> 
   349                              <1>  %if %0 >= 2
   349 00000227 BB[CE0E0000]        <1>  mov ebx, %2
   349                              <1>  %if %0 >= 3
   349 0000022C B9FF000000          <1>  mov ecx, %3
   349                              <1>  %if %0 = 4
   349 00000231 BA0A000000          <1>  mov edx, %4
   349                              <1>  %endif
   349                              <1>  %endif
   349                              <1>  %endif
   349 00000236 B823000000          <1>  mov eax, %1
   349                              <1> 
   349 0000023B CD40                <1>  int 40h
   350 0000023D EBDC                    		jmp	short Exit
   351                                  
   352                                  DetectSb:
   353 0000023F 60                      		pushad
   354                                  ScanPort:
   355 00000240 66BB1002                		mov     bx, 210h		; start scanning ports
   356                                  						; 210h, 220h, .. 260h
   357                                  ResetDSP:       
   358 00000244 6689DA                  		mov     dx, bx			; try to reset the DSP.
   359 00000247 6683C206                		add     dx, 06h
   360 0000024B B001                    		mov	al, 1
   361                                  		;out	dx, al
   362 0000024D B401                    		mov	ah, 1 ; outb
   363 0000024F CD34                    		int	34h
   364                                  
   365                                  		;in	al, dx
   366                                  		;in	al, dx
   367                                  		;in	al, dx
   368                                  		;in	al, dx
   369                                  
   370 00000251 B400                    		mov	ah, 0 ; inb
   371 00000253 CD34                    		int	34h
   372                                  		;mov	ah, 0 ; inb
   373 00000255 CD34                    		int	34h
   374                                  
   375 00000257 30C0                    		xor     al, al
   376                                  		;out	dx, al
   377 00000259 B401                    		mov	ah, 1 ; outb
   378 0000025B CD34                    		int	34h
   379                                  
   380 0000025D 6683C208                		add     dx, 08h
   381                                  		;mov	cx, 100
   382 00000261 66B92000                		mov	cx, 32
   383 00000265 28E4                    		sub	ah, ah ; 0
   384                                  WaitID:
   385                                  		;in	al, dx
   386 00000267 CD34                    		int	34h  ;ah = 0 ; inb
   387 00000269 08C0                    		or      al, al
   388 0000026B 7804                    		js      short GetID
   389 0000026D E2F8                    		loop    WaitID
   390 0000026F EB10                    		jmp     short NextPort
   391                                  GetID:          
   392 00000271 6683EA04                		sub     dx, 04h
   393                                  		;in	al, dx
   394 00000275 CD34                    		int	34h  ;ah = 0 ; inb
   395 00000277 3CAA                    		cmp     al, 0AAh
   396 00000279 7416                    		je      short Found
   397 0000027B 6683C204                		add     dx, 04h
   398 0000027F E2E6                    		loop    WaitID
   399                                  NextPort:
   400 00000281 6683C310                		add     bx, 10h			; if not response,
   401 00000285 6681FB6002              		cmp     bx, 260h		; try the next port.
   402 0000028A 76B8                    		jbe     short ResetDSP
   403 0000028C E934010000              		jmp     Fail
   404                                  Found:
   405 00000291 66891D[7E0D0000]        		mov     [SbAddr], bx		; SB Port Address Found!
   406                                  ScanIRQ:
   407                                  SetIrqs:        ; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ
   408                                  		sys	_calbac, 102h, 2, SbIrq ; IRQ 2
   408                              <1> 
   408                              <1> 
   408                              <1> 
   408                              <1> 
   408                              <1>  %if %0 >= 2
   408 00000298 BB02010000          <1>  mov ebx, %2
   408                              <1>  %if %0 >= 3
   408 0000029D B902000000          <1>  mov ecx, %3
   408                              <1>  %if %0 = 4
   408 000002A2 BA[800D0000]        <1>  mov edx, %4
   408                              <1>  %endif
   408                              <1>  %endif
   408                              <1>  %endif
   408 000002A7 B82C000000          <1>  mov eax, %1
   408                              <1> 
   408 000002AC CD40                <1>  int 40h
   409                                  						; Signal Response Byte
   410                                  		;jc	short error_exit
   411                                  
   412                                  		sys	_calbac, 103h, 3, SbIrq ; IRQ 3
   412                              <1> 
   412                              <1> 
   412                              <1> 
   412                              <1> 
   412                              <1>  %if %0 >= 2
   412 000002AE BB03010000          <1>  mov ebx, %2
   412                              <1>  %if %0 >= 3
   412 000002B3 B903000000          <1>  mov ecx, %3
   412                              <1>  %if %0 = 4
   412 000002B8 BA[800D0000]        <1>  mov edx, %4
   412                              <1>  %endif
   412                              <1>  %endif
   412                              <1>  %endif
   412 000002BD B82C000000          <1>  mov eax, %1
   412                              <1> 
   412 000002C2 CD40                <1>  int 40h
   413                                  						; Signal Response Byte 
   414                                  		;jc	short error_exit
   415                                  
   416                                  		sys	_calbac, 104h, 4, SbIrq ; IRQ 4
   416                              <1> 
   416                              <1> 
   416                              <1> 
   416                              <1> 
   416                              <1>  %if %0 >= 2
   416 000002C4 BB04010000          <1>  mov ebx, %2
   416                              <1>  %if %0 >= 3
   416 000002C9 B904000000          <1>  mov ecx, %3
   416                              <1>  %if %0 = 4
   416 000002CE BA[800D0000]        <1>  mov edx, %4
   416                              <1>  %endif
   416                              <1>  %endif
   416                              <1>  %endif
   416 000002D3 B82C000000          <1>  mov eax, %1
   416                              <1> 
   416 000002D8 CD40                <1>  int 40h
   417                                  						; Signal Response Byte 
   418                                  		;jc	short error_exit
   419                                  
   420                                  		sys	_calbac, 105h, 5, SbIrq ; IRQ 5
   420                              <1> 
   420                              <1> 
   420                              <1> 
   420                              <1> 
   420                              <1>  %if %0 >= 2
   420 000002DA BB05010000          <1>  mov ebx, %2
   420                              <1>  %if %0 >= 3
   420 000002DF B905000000          <1>  mov ecx, %3
   420                              <1>  %if %0 = 4
   420 000002E4 BA[800D0000]        <1>  mov edx, %4
   420                              <1>  %endif
   420                              <1>  %endif
   420                              <1>  %endif
   420 000002E9 B82C000000          <1>  mov eax, %1
   420                              <1> 
   420 000002EE CD40                <1>  int 40h
   421                                  						; Signal Response Byte 
   422                                  		;jc	short error_exit
   423                                  
   424                                  		sys	_calbac, 107h, 7, SbIrq ; IRQ 7
   424                              <1> 
   424                              <1> 
   424                              <1> 
   424                              <1> 
   424                              <1>  %if %0 >= 2
   424 000002F0 BB07010000          <1>  mov ebx, %2
   424                              <1>  %if %0 >= 3
   424 000002F5 B907000000          <1>  mov ecx, %3
   424                              <1>  %if %0 = 4
   424 000002FA BA[800D0000]        <1>  mov edx, %4
   424                              <1>  %endif
   424                              <1>  %endif
   424                              <1>  %endif
   424 000002FF B82C000000          <1>  mov eax, %1
   424                              <1> 
   424 00000304 CD40                <1>  int 40h
   425                                  						; Signal Response Byte 
   426                                  		;jc	short error_exit
   427                                  
   428 00000306 C605[800D0000]00        		mov     byte [SbIrq], 0		; clear the IRQ level.
   429                                  
   430 0000030D 668B15[7E0D0000]        		mov     dx, [SbAddr]		; tells to the SB to
   431 00000314 6683C20C                		add     dx, 0Ch			; generate a IRQ!
   432                                  WaitSb:         ;in	al, dx
   433 00000318 B400                    		mov	ah, 0 ; inb
   434 0000031A CD34                    		int	34h
   435 0000031C 08C0                    		or      al, al
   436 0000031E 78F8                    		js      short WaitSb
   437 00000320 B0F2                    		mov     al, 0F2h
   438                                  		;out	dx, al
   439 00000322 B401                    		mov	ah,1  ; outb
   440 00000324 CD34                    		int	34h		
   441                                  
   442 00000326 31C9                    		xor     ecx, ecx		; wait until IRQ level
   443                                  WaitIRQ:        
   444 00000328 803D[800D0000]00        		cmp     byte [SbIrq], 0		; is changed or timeout.
   445 0000032F 7506                    		jne     short IrqOk
   446 00000331 6649                    		dec 	cx
   447 00000333 75F3                    		jnz	short WaitIRQ
   448 00000335 EB0F                    		jmp	short RestoreIrqs
   449                                  IrqOk:
   450 00000337 668B15[7E0D0000]        		mov     dx, [SbAddr]
   451 0000033E 6683C20E                		add     dx, 0Eh
   452                                  		;in	al, dx			; SB acknowledge.
   453 00000342 B400                    		mov	ah, 0 ; inb
   454 00000344 CD34                    		int	34h
   455                                  		;mov	al, 20h
   456                                  		;;out	20h, al			; Hardware acknowledge.
   457                                  		;mov	ah,1  ; outb
   458                                  		;int	34h		
   459                                  
   460                                  RestoreIrqs:    ; UNLINK SIGNAL RESPONSE/RETURN BYTE FROM REQUESTED IRQ
   461                                  		sys	_calbac, 2		; unlink IRQ 2
   461                              <1> 
   461                              <1> 
   461                              <1> 
   461                              <1> 
   461                              <1>  %if %0 >= 2
   461 00000346 BB02000000          <1>  mov ebx, %2
   461                              <1>  %if %0 >= 3
   461                              <1>  mov ecx, %3
   461                              <1>  %if %0 = 4
   461                              <1>  mov edx, %4
   461                              <1>  %endif
   461                              <1>  %endif
   461                              <1>  %endif
   461 0000034B B82C000000          <1>  mov eax, %1
   461                              <1> 
   461 00000350 CD40                <1>  int 40h
   462                                  						; Signal Response Byte
   463                                  		sys	_calbac, 3		; unlink IRQ 3
   463                              <1> 
   463                              <1> 
   463                              <1> 
   463                              <1> 
   463                              <1>  %if %0 >= 2
   463 00000352 BB03000000          <1>  mov ebx, %2
   463                              <1>  %if %0 >= 3
   463                              <1>  mov ecx, %3
   463                              <1>  %if %0 = 4
   463                              <1>  mov edx, %4
   463                              <1>  %endif
   463                              <1>  %endif
   463                              <1>  %endif
   463 00000357 B82C000000          <1>  mov eax, %1
   463                              <1> 
   463 0000035C CD40                <1>  int 40h
   464                                  						; Signal Response Byte 
   465                                  		sys	_calbac, 4		; unlink IRQ 4
   465                              <1> 
   465                              <1> 
   465                              <1> 
   465                              <1> 
   465                              <1>  %if %0 >= 2
   465 0000035E BB04000000          <1>  mov ebx, %2
   465                              <1>  %if %0 >= 3
   465                              <1>  mov ecx, %3
   465                              <1>  %if %0 = 4
   465                              <1>  mov edx, %4
   465                              <1>  %endif
   465                              <1>  %endif
   465                              <1>  %endif
   465 00000363 B82C000000          <1>  mov eax, %1
   465                              <1> 
   465 00000368 CD40                <1>  int 40h
   466                                  						; Signal Response Byte 
   467                                  		sys	_calbac, 5		; unlink IRQ 5
   467                              <1> 
   467                              <1> 
   467                              <1> 
   467                              <1> 
   467                              <1>  %if %0 >= 2
   467 0000036A BB05000000          <1>  mov ebx, %2
   467                              <1>  %if %0 >= 3
   467                              <1>  mov ecx, %3
   467                              <1>  %if %0 = 4
   467                              <1>  mov edx, %4
   467                              <1>  %endif
   467                              <1>  %endif
   467                              <1>  %endif
   467 0000036F B82C000000          <1>  mov eax, %1
   467                              <1> 
   467 00000374 CD40                <1>  int 40h
   468                                  						; Signal Response Byte
   469                                  		sys	_calbac, 7		; unlink IRQ 7
   469                              <1> 
   469                              <1> 
   469                              <1> 
   469                              <1> 
   469                              <1>  %if %0 >= 2
   469 00000376 BB07000000          <1>  mov ebx, %2
   469                              <1>  %if %0 >= 3
   469                              <1>  mov ecx, %3
   469                              <1>  %if %0 = 4
   469                              <1>  mov edx, %4
   469                              <1>  %endif
   469                              <1>  %endif
   469                              <1>  %endif
   469 0000037B B82C000000          <1>  mov eax, %1
   469                              <1> 
   469 00000380 CD40                <1>  int 40h
   470                                  						; Signal Response Byte 
   471                                  
   472 00000382 803D[800D0000]00        		cmp     byte [SbIrq], 0		; IRQ level was changed?
   473 00000389 743A                    		je      short Fail		; no, fail.
   474                                  Success:        
   475 0000038B 668B15[7E0D0000]        		mov     dx, [SbAddr]		; Print Sucessful message.
   476 00000392 8A0D[800D0000]          		mov     cl, [SbIrq]
   477 00000398 C0EA04                  		shr     dl, 4
   478 0000039B 80C230                  		add     dl, '0'
   479 0000039E 8815[CE0F0000]          		mov     [PortText], dl
   480 000003A4 80C130                  		add     cl, '0'
   481 000003A7 880D[D70F0000]          		mov     [IrqText], cl
   482                                  
   483                                  		sys	_msg, MsgFound, 255, 0Fh
   483                              <1> 
   483                              <1> 
   483                              <1> 
   483                              <1> 
   483                              <1>  %if %0 >= 2
   483 000003AD BB[AE0F0000]        <1>  mov ebx, %2
   483                              <1>  %if %0 >= 3
   483 000003B2 B9FF000000          <1>  mov ecx, %3
   483                              <1>  %if %0 = 4
   483 000003B7 BA0F000000          <1>  mov edx, %4
   483                              <1>  %endif
   483                              <1>  %endif
   483                              <1>  %endif
   483 000003BC B823000000          <1>  mov eax, %1
   483                              <1> 
   483 000003C1 CD40                <1>  int 40h
   484                                  
   485 000003C3 61                      		popad				; Return to caller.
   486 000003C4 C3                      		retn
   487                                  
   488                                  Fail:  
   489                                  		; Print Failed Message,
   490                                  		; and exit to MainProg.
   491                                  
   492                                  		sys	_msg, MsgNotFound, 255, 0Fh
   492                              <1> 
   492                              <1> 
   492                              <1> 
   492                              <1> 
   492                              <1>  %if %0 >= 2
   492 000003C5 BB[860F0000]        <1>  mov ebx, %2
   492                              <1>  %if %0 >= 3
   492 000003CA B9FF000000          <1>  mov ecx, %3
   492                              <1>  %if %0 = 4
   492 000003CF BA0F000000          <1>  mov edx, %4
   492                              <1>  %endif
   492                              <1>  %endif
   492                              <1>  %endif
   492 000003D4 B823000000          <1>  mov eax, %1
   492                              <1> 
   492 000003D9 CD40                <1>  int 40h
   493                                  
   494                                  		sys 	_exit
   494                              <1> 
   494                              <1> 
   494                              <1> 
   494                              <1> 
   494                              <1>  %if %0 >= 2
   494                              <1>  mov ebx, %2
   494                              <1>  %if %0 >= 3
   494                              <1>  mov ecx, %3
   494                              <1>  %if %0 = 4
   494                              <1>  mov edx, %4
   494                              <1>  %endif
   494                              <1>  %endif
   494                              <1>  %endif
   494 000003DB B801000000          <1>  mov eax, %1
   494                              <1> 
   494 000003E0 CD40                <1>  int 40h
   495                                  here:
   496 000003E2 EBFE                    		jmp	short here
   497                                  
   498                                  ;=============================================================================
   499                                  ;               SB.ASM
   500                                  ;=============================================================================
   501                                  
   502                                  ;  Sound Blaster DMA Driver v0.1b by Carlos Hasan.
   503                                  ;		July 24th, 1993.
   504                                  
   505                                  ; EQUATES
   506                                  
   507                                  ; 06/10/2017
   508                                  ;DmaBufSize 	equ	4096 
   509                                  ;DmaBufSize 	equ	2048
   510                                  DmaBufSize 	equ	65536 ; 12/03/2017
   511                                  
   512                                  ; MACROS
   513                                  
   514                                  %macro	SbOut	1
   515                                  %%Wait:
   516                                  	;in	al, dx
   517                                  	mov	ah, 0
   518                                  	int	34h
   519                                  	or	al, al
   520                                  	js	short %%Wait
   521                                  	mov	al, %1
   522                                  	;out	dx, al
   523                                  	mov	ah, 1
   524                                  	int	34h
   525                                  %endmacro
   526                                  
   527                                  ; CODE
   528                                  
   529                                  ;--------------------------------------------------------------------------
   530                                  ; SbIrqHandler:  Sound Blaster IRQ handler.
   531                                  ;--------------------------------------------------------------------------
   532                                  
   533                                  SbIrqHandler:	; SoundBlaster IRQ Callback service for TRDOS 386
   534                                  		; 03/03/2017
   535                                  
   536                                  		; 12/03/2017
   537                                  		; 11/03/2017
   538                                  
   539 000003E4 668B15[7E0D0000]        		mov     dx, [SbAddr]
   540 000003EB 6683C20E                		add     dx, 0Eh
   541                                  		;in	al, dx
   542                                  		;mov	ah, 0
   543 000003EF 28E4                    		sub	ah, ah
   544 000003F1 CD34                    		int	34h
   545                                  
   546                                  		;test	byte [flags], ENDOFFILE	; end of file flag
   547                                  		;jz	short a_4
   548                                  
   549                                  		;sub     dx, 02h ; 0Ch
   550                                  
   551                                  		; exit auto-initialize 8 bit transfer
   552                                  		;SbOut	0DAh ; exit auto-initialize transfer command
   553                                  		;jmp	short a_6
   554                                  
   555                                  a_4:
   556 000003F3 30C0                    		xor	al, al ; 0
   557 000003F5 A2[29100000]            		mov	[iStatus], al
   558 000003FA 3805[28100000]          		cmp 	[DmaFlag], al
   559 00000400 7702                    		ja	short a_5
   560 00000402 FEC0                    		inc	al
   561                                  a_5:
   562 00000404 A2[28100000]            		mov 	[DmaFlag], al ; 
   563                                  a_6:
   564                                  		sys	_rele ; return from callback service
   564                              <1> 
   564                              <1> 
   564                              <1> 
   564                              <1> 
   564                              <1>  %if %0 >= 2
   564                              <1>  mov ebx, %2
   564                              <1>  %if %0 >= 3
   564                              <1>  mov ecx, %3
   564                              <1>  %if %0 = 4
   564                              <1>  mov edx, %4
   564                              <1>  %endif
   564                              <1>  %endif
   564                              <1>  %endif
   564 00000409 B827000000          <1>  mov eax, %1
   564                              <1> 
   564 0000040E CD40                <1>  int 40h
   565                                  
   566                                  ;--------------------------------------------------------------------------
   567                                  ; SbPoll:  Sound Blaster Polling.
   568                                  ;--------------------------------------------------------------------------
   569                                  
   570                                  SbPoll:
   571 00000410 60                      		pushad
   572                                  		
   573                                  		; 11/03/2017
   574 00000411 803D[29100000]00        		cmp	byte [iStatus], 0
   575 00000418 7721                    		ja	short Bye
   576                                  	
   577 0000041A C605[29100000]01        		mov	byte [iStatus], 1 ; 1 = set before interrupt
   578                                  			     ; (for preventing data load
   579                                  			     ; without an interrupt)	
   580                                  
   581                                  		;test	byte [flags], ENDOFFILE
   582                                  		;jnz	short sbPoll_stop
   583                                  
   584 00000421 BF[00000100]            		mov     edi, DmaBuffer
   585 00000426 BB00800000              		mov     ebx, DmaBufSize/2
   586                                  
   587 0000042B F605[28100000]01        		test	byte [DmaFlag], 1
   588 00000432 7402                    		jz	short FirstHalf
   589                                  SecondHalf:
   590 00000434 01DF                    		add     edi, ebx
   591                                  FirstHalf:
   592 00000436 E814080000              		call    GetSamples
   593                                  Bye:
   594 0000043B 61                      		popad
   595 0000043C C3                      		retn
   596                                  
   597                                  ;sbPoll_stop:	; 11/03/2017
   598                                  ;		; exit auto-initialize 8 bit transfer
   599                                  ;		SbOut	0DAh ; exit auto-initialize transfer command
   600                                  ;		;mov	byte [tLoop}, 0
   601                                  ;		jmp	short Bye
   602                                  
   603                                  ;--------------------------------------------------------------------------
   604                                  ; SbInit: Initializes the Sound Blaster Driver.
   605                                  ;--------------------------------------------------------------------------
   606                                  
   607                                  SbInit:
   608 0000043D 60                      		pushad
   609                                  
   610 0000043E E88B080000              		call    StartPlaying
   611                                  SetBuffer:
   612                                  		;mov	byte [DmaFlag], 0
   613 00000443 8B1D[40820000]          		mov	ebx, [DMA_phy_buff] ; physical addr of DMA buff
   614 00000449 B900000100              		mov     ecx, DmaBufSize
   615 0000044E 49                      		dec     ecx
   616                                  
   617                                  		; 8 bit DMA buffer setting (DMA channel 1)
   618 0000044F B005                    		mov     al, 05h ; set mask bit for channel 1  (4+1)
   619                                  		;out	0Ah, al
   620 00000451 66BA0A00                		mov	dx, 0Ah ; DMA mask register
   621 00000455 B401                    		mov	ah, 1  ;outb
   622 00000457 CD34                    		int	34h
   623                                  
   624 00000459 30C0                    		xor     al, al ; stops all DMA processes on selected channel
   625                                  		;out	0Ch, al
   626 0000045B B20C                    		mov	dl, 0Ch  ; clear selected channel register
   627                                  		;mov	ah, 1  ;outb
   628 0000045D CD34                    		int	34h
   629                                  
   630 0000045F 88D8                    		mov     al, bl	; byte 0 of DMA buffer address (physical)   
   631                                  		;out	02h, al
   632 00000461 B202                    		mov	dl, 02h	; DMA channel 1 port number
   633                                  		;mov	ah, 1  ;outb
   634 00000463 CD34                    		int	34h
   635                                  
   636 00000465 88F8                    		mov     al, bh  ; byte 1 of DMA buffer address (physical)   
   637                                  		;out	02h, al
   638                                  		;mov	dl, 02h ; DMA channel 1 port number
   639                                  		;mov	ah, 1  ;outb
   640 00000467 CD34                    		int	34h
   641                                  
   642 00000469 C1EB10                  		shr	ebx, 16
   643                                  
   644 0000046C 88D8                    		mov     al, bl ; byte 2 of DMA buffer address (physical)   
   645                                  		;out	83h, al
   646 0000046E B283                    		mov	dl, 83h ; page register port addr for channel 1
   647                                  		;mov	ah, 1  ;outb
   648 00000470 CD34                    		int	34h
   649                                  
   650 00000472 88C8                    		mov     al, cl ; low byte of DMA count - 1
   651                                  		;out	03h, al
   652 00000474 B203                    		mov	dl, 03h ; count register port addr for channel 1
   653                                  		;mov	ah, 1  ;outb
   654 00000476 CD34                    		int	34h
   655                                  
   656 00000478 88E8                    		mov     al, ch ; high byte of DMA count - 1
   657                                  		;out	03h, al
   658                                  		;mov	dl, 03h ; count register port addr for channel 1
   659                                  		;mov	ah, 1  ;outb
   660 0000047A CD34                    		int	34h
   661                                  
   662                                  		; channel 1, read, autoinitialized, single mode
   663 0000047C B059                    		mov	al, 59h ; 06/10/2017
   664                                  		;mov	al, 49h ; 02/10/2017 
   665                                  		;out	0Bh, al
   666 0000047E B20B                    		mov	dl, 0Bh ; DMA mode register port address
   667                                  		;mov	ah, 1  ;outb
   668 00000480 CD34                    		int	34h
   669                                  
   670 00000482 B001                    		mov     al, 01h ; clear mask bit for channel 1
   671                                  		;out	0Ah, al
   672 00000484 B20A                    		mov	dl, 0Ah ; DMA mask register port address
   673                                  		;mov	ah, 1  ;outb
   674 00000486 CD34                    		int	34h
   675                                  ClearBuffer:
   676 00000488 BF[00000100]            		mov     edi, DmaBuffer	; virtual addr of DMA buff
   677                                  		;mov	ecx, DmaBufSize
   678 0000048D 41                      		inc	ecx
   679 0000048E B080                    		mov     al, 80h
   680                                  		;cld
   681 00000490 F3AA                    		rep     stosb
   682                                  SetIrq:
   683                                  		; CALLBACK method
   684 00000492 8A1D[800D0000]          		mov	bl, [SbIrq] ; IRQ number
   685 00000498 B702                    		mov	bh, 2 ; Link IRQ to user for callback service
   686 0000049A BA[E4030000]            		mov	edx, SbIrqHandler
   687                                  		sys	_calbac 
   687                              <1> 
   687                              <1> 
   687                              <1> 
   687                              <1> 
   687                              <1>  %if %0 >= 2
   687                              <1>  mov ebx, %2
   687                              <1>  %if %0 >= 3
   687                              <1>  mov ecx, %3
   687                              <1>  %if %0 = 4
   687                              <1>  mov edx, %4
   687                              <1>  %endif
   687                              <1>  %endif
   687                              <1>  %endif
   687 0000049F B82C000000          <1>  mov eax, %1
   687                              <1> 
   687 000004A4 CD40                <1>  int 40h
   688                                  		; SIGNAL RESPONSE BYTE method ; 04/03/2017
   689                                  		;mov	bl, [SbIrq]
   690                                  		;mov	bh, 1 ; Signal Response Byte method
   691                                  		;movzx	ecx, bl ; S.R.B. value = IRQ Number 
   692                                  		;mov	edx, SbSrb ; S.R.B. address
   693                                  		;sys	_calbac
   694                                  ResetDsp:
   695 000004A6 668B15[7E0D0000]        		mov     dx, [SbAddr]
   696 000004AD 6683C206                		add     dx, 06h
   697 000004B1 B001                    		mov     al, 1
   698                                  		;out	dx, al
   699 000004B3 B401                    		mov	ah, 1  ;outb
   700 000004B5 CD34                    		int	34h
   701                                  
   702                                  		;in	al, dx
   703                                  		;in	al, dx
   704                                  		;in	al, dx
   705                                  		;in	al, dx
   706                                  
   707 000004B7 FECC                    		dec	ah ; ah = 0 ; inb
   708 000004B9 CD34                    		int	34h		
   709                                  		;mov	ah, 0
   710 000004BB CD34                    		int	34h
   711                                  
   712 000004BD 30C0                    		xor     al, al
   713                                  		;out	dx, al
   714 000004BF FEC4                    		inc	ah ; ah = 1 ;outb
   715 000004C1 CD34                    		int	34h
   716                                  
   717 000004C3 66B96400                		mov     cx, 100
   718 000004C7 28E4                    		sub	ah, ah ; 0
   719                                  WaitId:         
   720 000004C9 668B15[7E0D0000]        		mov     dx, [SbAddr]
   721 000004D0 6683C20E                		add     dx, 0Eh
   722                                  		;in	al, dx
   723                                  		;mov	ah, 0  ;inb
   724 000004D4 CD34                    		int	34h
   725 000004D6 08C0                    		or      al, al
   726 000004D8 7807                    		js      short sb_GetId
   727 000004DA E2ED                    		loop    WaitId
   728 000004DC E9B2000000              		jmp     sb_Exit
   729                                  sb_GetId:          
   730 000004E1 668B15[7E0D0000]        		mov     dx, [SbAddr]
   731 000004E8 6683C20A                		add     dx, 0Ah
   732                                  		;in	al, dx
   733                                  		;mov	ah, 0  ;inb
   734 000004EC CD34                    		int	34h
   735 000004EE 3CAA                    		cmp     al, 0AAh
   736 000004F0 7407                    		je      short SbOk
   737 000004F2 E2D5                    		loop    WaitId
   738 000004F4 E99A000000              		jmp	sb_Exit
   739                                  SbOk:
   740 000004F9 668B15[7E0D0000]        		mov     dx, [SbAddr]
   741 00000500 6683C20C                		add     dx, 0Ch
   742                                  		SbOut   0D1h
   742                              <1> %%Wait:
   742                              <1> 
   742 00000504 B400                <1>  mov ah, 0
   742 00000506 CD34                <1>  int 34h
   742 00000508 08C0                <1>  or al, al
   742 0000050A 78F8                <1>  js short %%Wait
   742 0000050C B0D1                <1>  mov al, %1
   742                              <1> 
   742 0000050E B401                <1>  mov ah, 1
   742 00000510 CD34                <1>  int 34h
   743                                  
   744                                  		; 11/03/2017
   745                                  		SbOut   41h ; 8 bit or 16 bit transfer
   745                              <1> %%Wait:
   745                              <1> 
   745 00000512 B400                <1>  mov ah, 0
   745 00000514 CD34                <1>  int 34h
   745 00000516 08C0                <1>  or al, al
   745 00000518 78F8                <1>  js short %%Wait
   745 0000051A B041                <1>  mov al, %1
   745                              <1> 
   745 0000051C B401                <1>  mov ah, 1
   745 0000051E CD34                <1>  int 34h
   746 00000520 668B1D[2A100000]        		mov	bx, [sampling_rate]
   747                                  		SbOut	bh ; sampling rate high byte
   747                              <1> %%Wait:
   747                              <1> 
   747 00000527 B400                <1>  mov ah, 0
   747 00000529 CD34                <1>  int 34h
   747 0000052B 08C0                <1>  or al, al
   747 0000052D 78F8                <1>  js short %%Wait
   747 0000052F 88F8                <1>  mov al, %1
   747                              <1> 
   747 00000531 B401                <1>  mov ah, 1
   747 00000533 CD34                <1>  int 34h
   748                                  		SbOut	bl ; sampling rate low byte
   748                              <1> %%Wait:
   748                              <1> 
   748 00000535 B400                <1>  mov ah, 0
   748 00000537 CD34                <1>  int 34h
   748 00000539 08C0                <1>  or al, al
   748 0000053B 78F8                <1>  js short %%Wait
   748 0000053D 88D8                <1>  mov al, %1
   748                              <1> 
   748 0000053F B401                <1>  mov ah, 1
   748 00000541 CD34                <1>  int 34h
   749                                  		
   750                                  		; 22/04/2017
   751                                  		;mov	ah, 1
   752                                  		;mov	dx, [SbAddr]
   753                                  		;add	dx, 4 ; Mixer chip address port
   754 00000543 6683EA08                		sub	dx, 0Ch-04h
   755 00000547 B022                    		mov	al, 22h ; master volume
   756 00000549 CD34                    		int	34h
   757 0000054B 6642                    		inc	dx
   758 0000054D B0FF                    		mov	al, 0FFh ; maximum volume level
   759 0000054F CD34                    		int	34h
   760 00000551 6683C207                		add	dx, 0Ch-05h
   761                                  StartDma:  
   762                                  		;; autoinitialized 8 bit DMA transfer mode
   763                                  		;mov	bx, 0C6h ; 8 bit output (0C6h)
   764                                  		; PCM output (8 bit mono autoinitialized transfer)
   765                                  		;SbOut  bl ; bCommand
   766                                  		;SbOut	bh ; bMode
   767                                  		SbOut	0C6h ; bCommand (C6h = 8 bit autoinitialized)
   767                              <1> %%Wait:
   767                              <1> 
   767 00000555 B400                <1>  mov ah, 0
   767 00000557 CD34                <1>  int 34h
   767 00000559 08C0                <1>  or al, al
   767 0000055B 78F8                <1>  js short %%Wait
   767 0000055D B0C6                <1>  mov al, %1
   767                              <1> 
   767 0000055F B401                <1>  mov ah, 1
   767 00000561 CD34                <1>  int 34h
   768                                  		SbOut	0    ; bMode (0 = 8 bit mono)	
   768                              <1> %%Wait:
   768                              <1> 
   768 00000563 B400                <1>  mov ah, 0
   768 00000565 CD34                <1>  int 34h
   768 00000567 08C0                <1>  or al, al
   768 00000569 78F8                <1>  js short %%Wait
   768 0000056B B000                <1>  mov al, %1
   768                              <1> 
   768 0000056D B401                <1>  mov ah, 1
   768 0000056F CD34                <1>  int 34h
   769 00000571 66BB0080                		mov	bx, DmaBufSize / 2
   770 00000575 664B                    		dec	bx  ; wBlkSize is one less than the actual size 
   771                                  		SbOut	bl
   771                              <1> %%Wait:
   771                              <1> 
   771 00000577 B400                <1>  mov ah, 0
   771 00000579 CD34                <1>  int 34h
   771 0000057B 08C0                <1>  or al, al
   771 0000057D 78F8                <1>  js short %%Wait
   771 0000057F 88D8                <1>  mov al, %1
   771                              <1> 
   771 00000581 B401                <1>  mov ah, 1
   771 00000583 CD34                <1>  int 34h
   772                                  		SbOut	bh
   772                              <1> %%Wait:
   772                              <1> 
   772 00000585 B400                <1>  mov ah, 0
   772 00000587 CD34                <1>  int 34h
   772 00000589 08C0                <1>  or al, al
   772 0000058B 78F8                <1>  js short %%Wait
   772 0000058D 88F8                <1>  mov al, %1
   772                              <1> 
   772 0000058F B401                <1>  mov ah, 1
   772 00000591 CD34                <1>  int 34h
   773                                  sb_Exit:           
   774 00000593 61                      		popad
   775 00000594 C3                      		retn
   776                                  
   777                                  ;--------------------------------------------------------------------------
   778                                  ; SbDone:  Shut Down the Sound Blaster Driver.
   779                                  ;--------------------------------------------------------------------------
   780                                  
   781                                  SbDone:
   782 00000595 60                      		pushad
   783                                  
   784 00000596 8A1D[800D0000]          		mov     bl, [SbIrq] ; IRQ number
   785 0000059C 28FF                    		sub	bh, bh ; 0 = Unlink IRQ from user
   786                                  		sys	_calbac 
   786                              <1> 
   786                              <1> 
   786                              <1> 
   786                              <1> 
   786                              <1>  %if %0 >= 2
   786                              <1>  mov ebx, %2
   786                              <1>  %if %0 >= 3
   786                              <1>  mov ecx, %3
   786                              <1>  %if %0 = 4
   786                              <1>  mov edx, %4
   786                              <1>  %endif
   786                              <1>  %endif
   786                              <1>  %endif
   786 0000059E B82C000000          <1>  mov eax, %1
   786                              <1> 
   786 000005A3 CD40                <1>  int 40h
   787                                  
   788 000005A5 668B15[7E0D0000]        		mov     dx, [SbAddr]
   789 000005AC 6683C20C                		add     dx, 0Ch
   790                                  		SbOut   0D0h
   790                              <1> %%Wait:
   790                              <1> 
   790 000005B0 B400                <1>  mov ah, 0
   790 000005B2 CD34                <1>  int 34h
   790 000005B4 08C0                <1>  or al, al
   790 000005B6 78F8                <1>  js short %%Wait
   790 000005B8 B0D0                <1>  mov al, %1
   790                              <1> 
   790 000005BA B401                <1>  mov ah, 1
   790 000005BC CD34                <1>  int 34h
   791                                  		SbOut   0D3h
   791                              <1> %%Wait:
   791                              <1> 
   791 000005BE B400                <1>  mov ah, 0
   791 000005C0 CD34                <1>  int 34h
   791 000005C2 08C0                <1>  or al, al
   791 000005C4 78F8                <1>  js short %%Wait
   791 000005C6 B0D3                <1>  mov al, %1
   791                              <1> 
   791 000005C8 B401                <1>  mov ah, 1
   791 000005CA CD34                <1>  int 34h
   792                                  
   793 000005CC E8AC070000              		call    StopPlaying
   794                                  
   795 000005D1 61                      		popad
   796 000005D2 C3                      		retn
   797                                  
   798                                  ;=============================================================================
   799                                  ;               MODLOAD.ASM
   800                                  ;=============================================================================
   801                                  
   802                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   803                                  ;		July 10th, 1993.
   804                                  
   805                                  ; STRUCTURES
   806                                  
   807                                  struc ModSample
   808 00000000 <res 00000016>          .msName:	resb 22
   809 00000016 <res 00000002>          .msLength:	resw 1
   810 00000018 <res 00000001>          .msFinetune:	resb 1
   811 00000019 <res 00000001>          .msVolume:	resb 1
   812 0000001A <res 00000002>          .msRepeat:	resw 1
   813 0000001C <res 00000002>          .msRepLen:	resw 1
   814                                  .size:		; 30 bytes
   815                                  endstruc
   816                                  
   817                                  struc ModHeader
   818 00000000 <res 00000014>          .mhName:	resb 20
   819 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   820 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   821 000003B7 <res 00000001>          .mhReStart:	resb 1
   822 000003B8 <res 00000080>          .mhOrder:	resb 128
   823 00000438 <res 00000004>          .mhSign:	resw 2
   824                                  .size:		; 1084 bytes
   825                                  endstruc
   826                                  
   827                                  struc ModInfoRec
   828 00000000 <res 00000001>          .OrderLen:	resb 1
   829 00000001 <res 00000001>          .ReStart:	resb 1
   830 00000002 <res 00000080>          .Order:		resb 128
   831 00000082 <res 00000004>          .Patterns:	resd 1
   832 00000086 <res 0000003E>          .SampOfs:	resw 31
   833 000000C4 <res 0000003E>          .SampSeg:	resw 31
   834 00000102 <res 0000003E>          .SampLen:	resw 31
   835 00000140 <res 0000003E>          .SampRep:	resw 31
   836 0000017E <res 0000003E>          .SampRepLen:	resw 31
   837 000001BC <res 0000003E>          .SampVol:	resw 31
   838                                  .size:		; 506 bytes	
   839                                  endstruc
   840                                  
   841                                  ; CODE
   842                                  
   843                                  ; 06/10/2017
   844                                  ; 04/10/2017
   845                                  ; /* MOD FileFormat */
   846                                  
   847                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   848                                  ID_FLT4 equ 34544C46h ; "FLT4"
   849                                  ID_8CHN equ 4E484338h ; "8CHN"
   850                                  ID_FLT8 equ 34544C46h ; "FLT8"
   851                                  
   852                                  ; CODE
   853                                  
   854                                  LoadModule:
   855                                  		; edi = file name address
   856                                  
   857 000005D3 60                      		pushad
   858                                  
   859 000005D4 E878010000              		call    ClearModInfo
   860                                  OpenFile:       
   861                                  		; ebx = ASCIIZ file name address
   862                                  		; ecx = open mode (0 = open for read)		
   863                                  		sys	_open, edi, 0 ; open for reading
   863                              <1> 
   863                              <1> 
   863                              <1> 
   863                              <1> 
   863                              <1>  %if %0 >= 2
   863 000005D9 89FB                <1>  mov ebx, %2
   863                              <1>  %if %0 >= 3
   863 000005DB B900000000          <1>  mov ecx, %3
   863                              <1>  %if %0 = 4
   863                              <1>  mov edx, %4
   863                              <1>  %endif
   863                              <1>  %endif
   863                              <1>  %endif
   863 000005E0 B805000000          <1>  mov eax, %1
   863                              <1> 
   863 000005E5 CD40                <1>  int 40h
   864 000005E7 0F8262010000            		jc	Failed
   865 000005ED A3[2C100000]            		mov     [FileHandle], eax
   866                                  ReadHeader:
   867                                  		; ebx = File handle
   868                                  		; ecx = Buffer address
   869                                  		; edx = Byte count
   870                                  		sys	_read, [FileHandle], Header, ModHeader.size
   870                              <1> 
   870                              <1> 
   870                              <1> 
   870                              <1> 
   870                              <1>  %if %0 >= 2
   870 000005F2 8B1D[2C100000]      <1>  mov ebx, %2
   870                              <1>  %if %0 >= 3
   870 000005F8 B9[30100000]        <1>  mov ecx, %3
   870                              <1>  %if %0 = 4
   870 000005FD BA3C040000          <1>  mov edx, %4
   870                              <1>  %endif
   870                              <1>  %endif
   870                              <1>  %endif
   870 00000602 B803000000          <1>  mov eax, %1
   870                              <1> 
   870 00000607 CD40                <1>  int 40h
   871 00000609 0F8231010000            		jc      CloseFile
   872                                  CheckMK:  
   873                                  		; 04/10/2017
   874 0000060F A1[68140000]            		mov	eax, [Header+ModHeader.mhSign]
   875                                        
   876 00000614 3D4D2E4B2E              		cmp	eax, ID_MK   ; cmp eax, '.K.M'
   877                                  		;je	short Is4chnMod
   878 00000619 742B                    		je	short IsModFile
   879                                  CheckFLT4:
   880 0000061B 3D464C5434              		cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   881                                  		;je	short Is4chnMod
   882 00000620 7424                    		je	short IsModFile
   883                                  Check8CHN:
   884 00000622 3D3843484E              		cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   885 00000627 740D                    		je	short Is8chnMod
   886                                  CheckFLT8:
   887 00000629 3D464C5434              		cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   888                                  		; 06/10/2017
   889 0000062E 7406                    		je	short Is8chnMod
   890 00000630 F9                      		stc
   891 00000631 E90A010000              		jmp	CloseFile
   892                                  Is8chnMod:
   893 00000636 C605[17100000]08        		mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   894 0000063D C605[16100000]0B        		mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   895 00000644 EB00                    		jmp	short IsModFile
   896                                  ;Is4chnMod:
   897                                  ;		mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   898                                  ;		mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   899                                  
   900                                  IsModFile:
   901 00000646 A0[E6130000]            		mov     al, [Header+ModHeader.mhOrderLen]
   902 0000064B A2[6C140000]            		mov     [ModInfo.OrderLen], al
   903                                  
   904 00000650 A0[E7130000]            		mov     al, [Header+ModHeader.mhReStart]
   905 00000655 3A05[E6130000]          		cmp     al, [Header+ModHeader.mhOrderLen]
   906 0000065B 7202                    		jb      short SetReStart
   907 0000065D B07F                    		mov     al, 7Fh
   908                                  SetReStart:
   909 0000065F A2[6D140000]            		mov     [ModInfo.ReStart], al
   910                                  
   911                                  		;mov	ecx, 128
   912 00000664 66B98000                		mov	cx, 128
   913 00000668 31D2                    		xor     edx, edx
   914 0000066A 31DB                    		xor     ebx, ebx
   915                                  CopyOrder:
   916 0000066C 8AB3[E8130000]          		mov     dh, [Header+ModHeader.mhOrder+ebx]
   917 00000672 88B3[6E140000]          		mov     [ModInfo.Order+ebx], dh
   918 00000678 38D6                    		cmp     dh, dl
   919 0000067A 7202                    		jb      short NextOrder
   920 0000067C 88F2                    		mov     dl, dh ; Max. pattern number ; 04/10/2017
   921                                  NextOrder:
   922 0000067E 43                      		inc     ebx
   923 0000067F E2EB                    		loop    CopyOrder
   924                                  AllocPatterns:  
   925 00000681 81E2FF000000            		and	edx, 0FFh
   926                                  		; 04/10/2017
   927                                  		;inx	dx  ; 12/03/2017
   928 00000687 FEC2                    		inc	dl
   929                                  		; dl = number of patterns (04/07/2017)
   930 00000689 8A0D[16100000]          		mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   931 0000068F D3E2                    		shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   932                                  				     ; *2048 ; (byte count of patterns *64*8*4)
   933                                  		;
   934 00000691 89D5                    		mov	ebp, edx ; offset of samples (04/07/2017)
   935                                  		;mov	ecx, 10000h ; next 64K (4096*16)
   936 00000693 B9[00000200]            		mov	ecx, file_buffer ; 12/03/2017
   937                                  		;
   938 00000698 890D[EE140000]          		mov	[ModInfo.Patterns], ecx
   939                                  		;
   940 0000069E 01CD                    		add	ebp, ecx ; next offset for samples
   941                                  ReadPatterns:  
   942                                  		;mov	ebx, [FileHandle] 
   943                                  		; ebx = File handle
   944                                  		; ecx = Buffer address
   945                                  		; edx = Byte count
   946                                  		sys	_read, [FileHandle]
   946                              <1> 
   946                              <1> 
   946                              <1> 
   946                              <1> 
   946                              <1>  %if %0 >= 2
   946 000006A0 8B1D[2C100000]      <1>  mov ebx, %2
   946                              <1>  %if %0 >= 3
   946                              <1>  mov ecx, %3
   946                              <1>  %if %0 = 4
   946                              <1>  mov edx, %4
   946                              <1>  %endif
   946                              <1>  %endif
   946                              <1>  %endif
   946 000006A6 B803000000          <1>  mov eax, %1
   946                              <1> 
   946 000006AB CD40                <1>  int 40h
   947 000006AD 0F828D000000            		jc      CloseFile
   948                                  
   949                                  		; patterns have been loaded here... (04/07/2017)
   950                                  
   951 000006B3 BE[44100000]            		mov	esi, Header+ModHeader.mhSamples
   952 000006B8 31FF                    		xor     edi, edi
   953                                  CopySamples:
   954 000006BA 668B4616                		mov     ax, [esi+ModSample.msLength]
   955 000006BE 86C4                    		xchg    al, ah
   956 000006C0 66D1E0                  		shl     ax, 1
   957 000006C3 668987[6E150000]        		mov     [ModInfo.SampLen+edi], ax
   958 000006CA 8A4619                  		mov     al, [esi+ModSample.msVolume]
   959 000006CD 30E4                    		xor     ah, ah
   960 000006CF 668987[28160000]        		mov     [ModInfo.SampVol+edi], ax
   961 000006D6 668B461A                		mov     ax, [esi+ModSample.msRepeat]
   962 000006DA 86C4                    		xchg    al, ah
   963 000006DC 66D1E0                  		shl     ax, 1
   964 000006DF 668987[AC150000]        		mov     [ModInfo.SampRep+edi], ax
   965 000006E6 668B461C                		mov     ax, [esi+ModSample.msRepLen]
   966 000006EA 86C4                    		xchg    al, ah
   967 000006EC 66D1E0                  		shl     ax, 1
   968 000006EF 668987[EA150000]        		mov     [ModInfo.SampRepLen+edi], ax
   969 000006F6 83C61E                  		add     esi, ModSample.size
   970 000006F9 6683C702                		add     di, 2
   971 000006FD 6683FF3E                		cmp     di, 2*31
   972 00000701 72B7                    		jb      short CopySamples
   973                                  
   974 00000703 31F6                    		xor     esi, esi
   975                                  AllocSamples:
   976 00000705 0FB796[6E150000]        		movzx	edx, word [ModInfo.SampLen+esi]
   977 0000070C 09D2                    		or	edx, edx ; byte count
   978 0000070E 7426                    		jz      short NextSample
   979 00000710 89E8                    		mov	eax, ebp
   980 00000712 668986[F2140000]        		mov	[ModInfo.SampOfs+esi], ax
   981 00000719 C1E810                  		shr	eax, 16
   982 0000071C 668986[30150000]        		mov	[ModInfo.SampSeg+esi], ax
   983 00000723 89E9                    		mov	ecx, ebp
   984 00000725 01D5                    		add	ebp, edx ; next offset for sample 
   985                                  ReadSample:
   986                                  		;mov	ebx, [FileHandle]
   987                                  		;movzx  edx, [ModInfo.SampLen+esi]
   988                                  		;mov    ecx, [ModInfo.SampOfs+esi]
   989                                  
   990                                  		; ebx = File handle
   991                                  		; ecx = Buffer address
   992                                  		; edx = Byte count
   993                                  		sys	_read, [FileHandle]
   993                              <1> 
   993                              <1> 
   993                              <1> 
   993                              <1> 
   993                              <1>  %if %0 >= 2
   993 00000727 8B1D[2C100000]      <1>  mov ebx, %2
   993                              <1>  %if %0 >= 3
   993                              <1>  mov ecx, %3
   993                              <1>  %if %0 = 4
   993                              <1>  mov edx, %4
   993                              <1>  %endif
   993                              <1>  %endif
   993                              <1>  %endif
   993 0000072D B803000000          <1>  mov eax, %1
   993                              <1> 
   993 00000732 CD40                <1>  int 40h
   994 00000734 720A                    		jc      short CloseFile
   995                                  
   996                                  NextSample:
   997 00000736 6683C602                		add     si, 2
   998 0000073A 6683FE3E                		cmp     si, 2*31
   999 0000073E 72C5                    		jb      short AllocSamples
  1000                                  CloseFile:      
  1001 00000740 9C                      		pushf
  1002                                  		sys	_close, [FileHandle]
  1002                              <1> 
  1002                              <1> 
  1002                              <1> 
  1002                              <1> 
  1002                              <1>  %if %0 >= 2
  1002 00000741 8B1D[2C100000]      <1>  mov ebx, %2
  1002                              <1>  %if %0 >= 3
  1002                              <1>  mov ecx, %3
  1002                              <1>  %if %0 = 4
  1002                              <1>  mov edx, %4
  1002                              <1>  %endif
  1002                              <1>  %endif
  1002                              <1>  %endif
  1002 00000747 B806000000          <1>  mov eax, %1
  1002                              <1> 
  1002 0000074C CD40                <1>  int 40h
  1003 0000074E 9D                      		popf
  1004                                  Failed:       
  1005 0000074F 61                      		popad
  1006 00000750 C3                      		retn
  1007                                  
  1008                                  FreeModule:
  1009                                  		; Erdogan Tan (13/02/2017)
  1010                                  		; nothing to do here for memory de-allocation
  1011                                  ClearModInfo:
  1012 00000751 57                      		push	edi
  1013 00000752 BF[6C140000]            		mov	edi, ModInfo
  1014 00000757 B9FA010000              		mov     ecx, ModInfoRec.size
  1015                                  		;cld
  1016 0000075C 30C0                    		xor     al, al
  1017 0000075E F3AA                    		rep     stosb
  1018 00000760 5F                      		pop	edi
  1019 00000761 C3                      		retn
  1020                                  
  1021                                  ;=============================================================================
  1022                                  ;               MODPLAY.ASM
  1023                                  ;=============================================================================
  1024                                  
  1025                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
  1026                                  ;		July 23th, 1993.
  1027                                  
  1028                                  ; EQUATES
  1029                                  
  1030                                  ;NumTracks	equ 4 ; 06/10/2017 ([numtracks])
  1031                                  DefTempo        equ 6
  1032                                  DefBpm          equ 125
  1033                                  MidCRate        equ 8448
  1034                                  MixBufSize      equ 4096
  1035                                  
  1036                                  ; STRUCTURES
  1037                                  
  1038                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
  1039 00000000 <res 00000004>          .Samples:	resd 1
  1040                                  ;.Position:	resw 1
  1041 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
  1042 00000008 <res 00000002>          .Len:		resw 1
  1043 0000000A <res 00000002>          .Repeat:	resw 1
  1044 0000000C <res 00000002>          .RepLen:	resw 1
  1045 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
  1046 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
  1047                                  ;.Error:	resb 1
  1048                                  ;.Reserved:	resb 1 ; 01/10/2017
  1049 00000010 <res 00000002>          .Period:	resw 1 ; Period
  1050 00000012 <res 00000002>          .Pitch:		resw 1 
  1051 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
  1052 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
  1053 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
  1054 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
  1055 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
  1056 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
  1057 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
  1058                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
  1059 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
  1060 0000001E <res 00000006>          .Arp:		resw 3
  1061 00000024 <res 00000002>          .ArpIndex:	resw 1
  1062                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
  1063                                  endstruc
  1064                                  
  1065                                  ; CODE
  1066                                  
  1067                                  ;--------------------------------------------------------------------------
  1068                                  ; updatechannel - update the track using the current effect
  1069                                  ;--------------------------------------------------------------------------
  1070                                  ; 
  1071                                  ;--------------------------------------------------------------------------
  1072                                  ; BeatTrack:  Process the next beat in one track.
  1073                                  ;  In:
  1074                                  ;    ds:di -  Track info Address.
  1075                                  ;--------------------------------------------------------------------------
  1076                                  
  1077                                  ; edi = Track info address
  1078                                  
  1079                                  updatechannel:
  1080                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
  1081                                  
  1082 00000762 668B5714                		mov     dx, [edi+TrackInfo.Effect]
  1083                                  
  1084                                  		;test   dx, dx
  1085                                  		;je     short None
  1086                                  		;cmp    dh, 00h
  1087                                  		;je     short Arpeggio
  1088                                  		;cmp    dh, 01h
  1089                                  		;je     short PortUp
  1090                                  		;cmp    dh, 02h
  1091                                  		;je     short PortDown
  1092                                  		;cmp    dh, 03h
  1093                                  		;je     TonePort
  1094                                  		;cmp    dh, 04h
  1095                                  		;je     Vibrato
  1096                                  		;cmp    dh, 05h
  1097                                  		;je     PortSlide
  1098                                  		;cmp    dh, 06h
  1099                                  		;je     VibSlide
  1100                                  		;cmp    dh, 0Ah
  1101                                  		;je     VolSlide
  1102                                  		;retn
  1103                                  
  1104 00000766 0FB6C6                  		movzx	eax, dh
  1105 00000769 240F                    		and	al, 0Fh
  1106 0000076B FF2485[C40D0000]        		jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
  1107                                  efxnull:
  1108                                  None:           
  1109 00000772 C3                      		retn
  1110                                  efxarpeggio2:
  1111                                  		; 01/10/2017
  1112 00000773 84D2                    		test    dl, dl
  1113 00000775 74FB                    		jz      short efxnull
  1114                                  Arpeggio:
  1115 00000777 0FB75F24                		movzx   ebx, word [edi+TrackInfo.ArpIndex]
  1116 0000077B 668B441F1E              		mov     ax, [edi+TrackInfo.Arp+ebx]
  1117 00000780 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1118 00000784 6683C302                		add     bx, 2
  1119 00000788 6683FB06                		cmp     bx, 6
  1120 0000078C 7202                    		jb      short SetArpIndex
  1121 0000078E 31DB                    		xor     ebx, ebx
  1122                                  SetArpIndex:
  1123 00000790 66895F24                		mov     [edi+TrackInfo.ArpIndex], bx
  1124 00000794 C3                      		retn
  1125                                  efxportaup:
  1126                                  PortUp:
  1127 00000795 30F6                    		xor     dh, dh
  1128                                  		;mov	bx, [edi+TrackInfo.Period]
  1129 00000797 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1130 0000079B 6629D3                  		sub     bx, dx
  1131                                  		;cmp	bx, 113
  1132 0000079E 6683FB1C                		cmp	bx, 28 ; 01/10/2017 
  1133 000007A2 7D04                    		jge     short NotSmall
  1134                                  		;mov	bx, 113
  1135 000007A4 66BB1C00                		mov	bx, 28 ; 01/10/2017
  1136                                  NotSmall:
  1137 000007A8 66895F10                		mov     [edi+TrackInfo.Period], bx
  1138 000007AC 6601DB                  		add     bx, bx
  1139                                  		;mov	ax, [PitchTable+bx]
  1140 000007AF 668B83[66160000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1141 000007B6 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1142 000007BA C3                      		retn
  1143                                  efxportadown:
  1144                                  PortDown:
  1145 000007BB 30F6                    		xor     dh, dh
  1146                                  		;mov	bx, [edi+TrackInfo.Period]
  1147 000007BD 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1148 000007C1 6601D3                  		add     bx, dx
  1149 000007C4 6681FB600D              		cmp	bx, 3424 ; 01/10/2017 
  1150                                  		;cmp	bx, 856
  1151 000007C9 7E04                    		jle     short NotBig
  1152                                  		;mov	bx, 856
  1153 000007CB 66BB600D                		mov	bx, 3424 ; 01/10/2017
  1154                                  NotBig:         
  1155 000007CF 66895F10                		mov     [edi+TrackInfo.Period], bx
  1156 000007D3 6601DB                  		add     bx, bx
  1157                                  		;mov	ax, [PitchTable+bx]
  1158 000007D6 668B83[66160000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1159 000007DD 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1160 000007E1 C3                      		retn
  1161                                  efxtoneporta2:
  1162                                  TonePort:
  1163 000007E2 30F6                    		xor     dh, dh
  1164 000007E4 668B4716                		mov     ax, [edi+TrackInfo.PortTo]
  1165                                  		;mov	bx, [edi+TrackInfo.Period]
  1166 000007E8 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1167 000007EC 6639C3                  		cmp     bx, ax
  1168 000007EF 7429                    		je      short NoPort
  1169 000007F1 7F0D                    		jg      short PortToUp
  1170                                  PortToDown:     
  1171 000007F3 6601D3                  		add     bx, dx
  1172 000007F6 6639C3                  		cmp     bx, ax
  1173 000007F9 7E0D                    		jle     short SetPort
  1174                                  FixPort:        
  1175 000007FB 6689C3                  		mov     bx, ax
  1176 000007FE EB08                    		jmp     short SetPort
  1177                                  PortToUp:
  1178 00000800 6629D3                  		sub     bx, dx
  1179 00000803 6639C3                  		cmp     bx, ax
  1180 00000806 7CF3                    		jl      short FixPort
  1181                                  SetPort:        
  1182 00000808 66895F10                		mov     [edi+TrackInfo.Period], bx
  1183 0000080C 6601DB                  		add     bx, bx
  1184                                  		;mov	ax, [PitchTable+bx]
  1185 0000080F 668B83[66160000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1186 00000816 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1187                                  NoPort:         
  1188 0000081A C3                      		retn
  1189                                  efxvibrato2:
  1190                                  		; 01/10/2017
  1191                                  Vibrato:
  1192 0000081B 88D6                    		mov     dh, dl
  1193                                  		;and	dl, 0Fh
  1194                                  		;shr	dh, 4
  1195                                  		;shl	dh, 2
  1196 0000081D 6681E20FF0              		and     dx, 0F00Fh
  1197 00000822 C0EE02                  		shr     dh, 2
  1198                                  		;add	[edi+TrackInfo.VibPos], dh
  1199                                  		;mov	dh, [edi+TrackInfo.VibPos]
  1200                                  		;mov	bl, dh
  1201 00000825 8A5F19                  		mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
  1202 00000828 007719                  		add	[edi+TrackInfo.VibPos], dh
  1203 0000082B 88DE                    		mov	dh, bl ; 01/10/2017
  1204 0000082D C0EB02                  		shr     bl, 2
  1205                                  		;and	bx, 1Fh
  1206                                  		;mov	al, [SinTable+bx]
  1207 00000830 83E31F                  		and	ebx, 1Fh
  1208 00000833 8A83[AC0E0000]          		mov	al, [SinTable+ebx]
  1209 00000839 F6E2                    		mul     dl
  1210                                  		;rol	ax, 1
  1211                                  		;xchg	al, ah
  1212                                  		;and	ah, 1
  1213 0000083B 66C1E807                		shr	ax, 7
  1214 0000083F 84F6                    		test    dh, dh
  1215 00000841 7903                    		jns     short VibUp
  1216 00000843 66F7D8                  		neg     ax
  1217                                  VibUp:          
  1218 00000846 66034710                		add     ax, [edi+TrackInfo.Period]
  1219 0000084A 6689C3                  		mov	bx, ax
  1220                                  		;movzx	ebx, ax
  1221 0000084D 6683FB71                		cmp     bx, 113
  1222                                  		;cmp	bx, 113
  1223 00000851 6683FB1C                		cmp	bx, 28  ; 01/10/2017
  1224 00000855 7D06                    		jge     short NoLoVib
  1225                                  		;mov	bx, 113
  1226 00000857 66BB1C00                		mov	bx, 28	; 01/10/2017
  1227 0000085B EB0B                    		jmp	short NoHiVib ; 01/10/2017	
  1228                                  NoLoVib:        
  1229 0000085D 6681FB600D              		cmp	bx, 3424 ; 01/10/2017 
  1230                                  		;cmp	bx, 856
  1231 00000862 7E04                    		jle     short NoHiVib
  1232                                  		;mov	bx, 856
  1233 00000864 66BB600D                		mov	bx, 3424 ; 01/10/2017
  1234                                  NoHiVib:        
  1235 00000868 6601DB                  		add     bx, bx
  1236                                  		;mov	ax, [PitchTable+bx]
  1237 0000086B 668B83[66160000]        		mov	ax, [PitchTable+ebx] ; 01/10/2017
  1238 00000872 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1239 00000876 C3                      		retn
  1240                                  efxtoneslide:
  1241                                  PortSlide:
  1242 00000877 E812000000              		call    VolSlide
  1243 0000087C 8A5718                  		mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1244 0000087F E95EFFFFFF              		jmp     TonePort  ; efxtoneporta2
  1245                                  efxvibslide:
  1246                                  VibSlide:
  1247 00000884 E805000000              		call    VolSlide
  1248 00000889 8A571A                  		mov     dl, [edi+TrackInfo.VibParm]
  1249 0000088C EB8D                    		jmp     short Vibrato  ; efxvibrato2
  1250                                  efxvolslide:
  1251                                  VolSlide:
  1252 0000088E 88D6                    		mov     dh, dl
  1253 00000890 80E20F                  		and     dl, 0Fh
  1254 00000893 C0EE04                  		shr     dh, 4
  1255 00000896 8A470E                  		mov     al, [edi+TrackInfo.Volume]
  1256 00000899 28D0                    		sub     al, dl
  1257 0000089B 7D02                    		jge     short NoLoVol
  1258 0000089D 30C0                    		xor     al, al
  1259                                  NoLoVol:        
  1260 0000089F 00F0                    		add     al, dh
  1261 000008A1 3C40                    		cmp     al, 64
  1262 000008A3 7602                    		jbe     short NoHiVol
  1263 000008A5 B040                    		mov     al, 64
  1264                                  NoHiVol:        
  1265 000008A7 88470E                  		mov     [edi+TrackInfo.Volume], al
  1266 000008AA C3                      		retn
  1267                                  
  1268                                  efxtremolo2:
  1269                                  		; 01/10/2017 (TMODPLAY.ASM)
  1270                                  Tremolo:
  1271 000008AB 88D6                    		mov     dh, dl
  1272 000008AD 6681E20FF0              		and     dx, 0F00Fh
  1273 000008B2 C0EE02                  		shr     dh, 2
  1274 000008B5 8A5F1B                  		mov	bl, [edi+TrackInfo.TremPos]
  1275 000008B8 00771B                  		add	[edi+TrackInfo.TremPos], dh
  1276 000008BB 88DE                    		mov	dh, bl
  1277 000008BD C0EB02                  		shr     bl, 2
  1278                                  		; 01/10/2017 - TRDOS 386
  1279                                  		;and	bx, 1Fh
  1280 000008C0 83E31F                  		and	ebx, 1Fh 
  1281                                  		;mov	al, [SinTable+bx]
  1282 000008C3 8A83[AC0E0000]          		mov     al, [SinTable+ebx]
  1283 000008C9 F6E2                    		mul     dl
  1284 000008CB 66C1E806                		shr	ax, 6
  1285 000008CF 84F6                    		test    dh, dh
  1286 000008D1 7D03                    		jge	short Tremolo_1 ; efxtremolof2
  1287 000008D3 66F7D8                  		neg     ax
  1288                                  efxtremolof2:
  1289                                  Tremolo_1:      
  1290 000008D6 8A670E                  		mov	ah, [edi+TrackInfo.Volume]    
  1291 000008D9 00E0                    		add     al, ah
  1292 000008DB 7D02                    		jge     short Tremolo_2 ; efxtremolof3
  1293 000008DD 30C0                    		xor     al, al
  1294                                  efxtremolof3:
  1295                                  Tremolo_2:       
  1296 000008DF 3C40                    		cmp     al, 64 ; 40h
  1297 000008E1 7E02                    		jle     short Tremolo_3 ; efxtremolof4
  1298 000008E3 B040                    		mov     al, 64 ; 40h
  1299                                  efxtremolof4:
  1300                                  Tremolo_3:       
  1301 000008E5 28E0                    		sub	al, ah  ; ****** 
  1302 000008E7 88470F                  		mov     [edi+TrackInfo.VolDiff], al
  1303 000008EA C3                      		retn	
  1304                                  
  1305                                  ;--------------------------------------------------------------------------
  1306                                  ; readchannel - read the next note event from the pattern sheet
  1307                                  ;--------------------------------------------------------------------------
  1308                                  ;
  1309                                  ;--------------------------------------------------------------------------
  1310                                  ; GetTrack:   Get the next Note from a pattern.
  1311                                  ;  In:
  1312                                  ;    ds:di -  Track info Address.
  1313                                  ;    es:si -  Pattern Note Address.
  1314                                  ; Out:
  1315                                  ;    es:si -  The Next Pattern Note address.
  1316                                  ;--------------------------------------------------------------------------
  1317                                  
  1318                                  ; esi = Pattern note address
  1319                                  ; edi = Track info address
  1320                                  
  1321                                  readchannel:
  1322                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1323 000008EB 66AD                    		lodsw
  1324 000008ED 86C4                    		xchg    al, ah
  1325 000008EF 88E3                    		mov	bl, ah
  1326 000008F1 80E40F                  		and     ah, 0Fh
  1327 000008F4 6689C1                  		mov     cx, ax
  1328 000008F7 66AD                    		lodsw
  1329 000008F9 86C4                    		xchg    al, ah
  1330 000008FB 88E7                    		mov     bh, ah
  1331 000008FD 80E40F                  		and     ah, 0Fh
  1332 00000900 6689C2                  		mov     dx, ax
  1333 00000903 66895714                		mov     [edi+TrackInfo.Effect], dx
  1334                                  		; 01/10/2017 - TRDOS 386
  1335                                  		;and	bl, 0F0h
  1336 00000907 81E3F0FF0000            		and	ebx, 0FFF0h
  1337 0000090D C0EF04                  		shr     bh, 4
  1338 00000910 08FB                    		or      bl, bh
  1339 00000912 7446                    		je      short SetPeriod
  1340                                  SetSample:
  1341 00000914 30FF                    		xor	bh, bh
  1342                                  		;and	ebx, 0FFh
  1343 00000916 FECB                    		dec     bl
  1344 00000918 01DB                    		add     ebx, ebx
  1345 0000091A 668B83[28160000]        		mov     ax, [ModInfo.SampVol+ebx]
  1346 00000921 88470E                  		mov     [edi+TrackInfo.Volume], al
  1347 00000924 668B83[F2140000]        		mov     ax, [ModInfo.SampOfs+ebx]
  1348 0000092B 668907                  		mov     [edi+TrackInfo.Samples], ax
  1349 0000092E 668B83[30150000]        		mov     ax, [ModInfo.SampSeg+ebx]
  1350 00000935 66894702                		mov     [edi+TrackInfo.Samples+2], ax
  1351 00000939 668B83[6E150000]        		mov     ax, [ModInfo.SampLen+ebx]
  1352 00000940 66894708                		mov     [edi+TrackInfo.Len], ax
  1353 00000944 668B83[AC150000]        		mov     ax, [ModInfo.SampRep+ebx]
  1354 0000094B 6689470A                		mov     [edi+TrackInfo.Repeat], ax
  1355 0000094F 668B83[EA150000]        		mov     ax, [ModInfo.SampRepLen+ebx]
  1356 00000956 6689470C                		mov     [edi+TrackInfo.RepLen], ax
  1357                                  SetPeriod:      
  1358 0000095A 6685C9                  		test    cx, cx
  1359 0000095D 7425                    		jz      short SetEffect
  1360                                  
  1361 0000095F 66894F16                		mov     [edi+TrackInfo.PortTo], cx ; *
  1362                                  		
  1363 00000963 80FE03                  		cmp     dh, 03h
  1364                                  		;je	short SetEffect
  1365 00000966 7428                    		je	short efxtoneporta ; 01/10/2017
  1366                                  
  1367 00000968 66894F10                		mov     [edi+TrackInfo.Period], cx
  1368                                  		;movzx	ebx, cx
  1369 0000096C 6689CB                  		mov     bx, cx
  1370 0000096F 6601DB                  		add     bx, bx
  1371                                  		;mov	ax, [PitchTable+bx]
  1372 00000972 668B83[66160000]        		mov	ax, [PitchTable+ebx] ; 01/10/2017
  1373 00000979 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1374 0000097D C7470400000000          		mov     dword [edi+TrackInfo.Position], 0
  1375                                  SetEffect:
  1376                                  		;test	dx, dx
  1377                                  		;je	short InitNone
  1378                                  		;cmp	dh, 00h
  1379                                  		;je	InitArpeggio
  1380                                  		;cmp	dh, 03h
  1381                                  		;je	short InitTonePort
  1382                                  		;cmp	dh, 04h
  1383                                  		;je	short InitVibrato
  1384                                  		;cmp	dh, 09h
  1385                                  		;je	short SampleOfs
  1386                                  		;cmp	dh, 0Bh
  1387                                  		;je	short PosJump
  1388                                  		;cmp	dh, 0Ch
  1389                                  		;je	short SetVolume
  1390                                  		;cmp	dh, 0Dh
  1391                                  		;je	short Break
  1392                                  		;cmp	dh, 0Fh
  1393                                  		;je	SetSpeed
  1394                                  		;retn
  1395                                  
  1396                                  		; 01/10/2017 (TMODPLAY.ASM)
  1397                                  		
  1398                                  		; dx = [di+TrackInfo.Effect]
  1399                                  		
  1400 00000984 0FB6C6                  		movzx	eax, dh
  1401 00000987 240F                    		and	al, 0Fh
  1402 00000989 FF2485[840D0000]        		jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1403                                  ;efxnull:
  1404                                  ;InitNone:
  1405                                  ;		retn
  1406                                  efxtoneporta:
  1407                                  		; 01/10/2017
  1408                                  		; cx = period
  1409                                  		;mov	[edi+TrackInfo.PortTo], cx ; *
  1410                                  InitTonePort:
  1411 00000990 84D2                    		test    dl, dl
  1412 00000992 7503                    		jnz     short SetPortParm
  1413 00000994 8A5718                  		mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1414                                  SetPortParm:    
  1415 00000997 885718                  		mov     [edi+TrackInfo.PortParm], dl
  1416 0000099A 66895714                		mov     [edi+TrackInfo.Effect], dx
  1417 0000099E C3                      		retn
  1418                                  efxvibrato:
  1419                                  InitVibrato:
  1420 0000099F 8A471A                  		mov     al, [edi+TrackInfo.VibParm]
  1421 000009A2 88C4                    		mov     ah, al
  1422                                  		;and	al, 0Fh
  1423                                  		;and	ah, 0F0h
  1424 000009A4 66250FF0                		and	ax, 0F00Fh
  1425 000009A8 F6C20F                  		test    dl, 0Fh
  1426 000009AB 7502                    		jne     short OkDepth
  1427 000009AD 08C2                    		or      dl, al
  1428                                  OkDepth:        
  1429 000009AF F6C2F0                  		test    dl, 0F0h
  1430 000009B2 7502                    		jnz     short OkRate
  1431 000009B4 08E2                    		or      dl, ah
  1432                                  OkRate:         
  1433 000009B6 88571A                  		mov     [edi+TrackInfo.VibParm], dl
  1434 000009B9 66895714                		mov     [edi+TrackInfo.Effect], dx
  1435 000009BD 6685C9                  		test    cx, cx
  1436 000009C0 7404                    		jz      short OkPos
  1437 000009C2 C6471900                		mov     byte [edi+TrackInfo.VibPos], 0
  1438                                  OkPos:          
  1439 000009C6 C3                      		retn
  1440                                  efxsampoffset:
  1441                                  		; 01/10/2017 ; *******
  1442                                  SampleOfs:         
  1443                                  ;		test    dl, dl
  1444                                  ;		jnz     short SetSampleOfs
  1445                                  ;		mov     dl, [edi+TrackInfo.OldSampOfs]
  1446                                  ;SetSampleOfs:
  1447                                  ;		mov     [edi+TrackInfo.OldSampOfs], dl
  1448 000009C7 88D6                    		mov     dh, dl
  1449 000009C9 81E200FF0000            		and 	edx, 0FF00h ; 05/03/2017
  1450 000009CF 895704                  		mov     [edi+TrackInfo.Position], edx
  1451 000009D2 C3                      		retn
  1452                                  efxpattjump:
  1453                                  PosJump:
  1454 000009D3 8815[28820000]          		mov     [OrderPos], dl
  1455 000009D9 C605[2C820000]40        		mov     byte [Row], 64
  1456 000009E0 C3                      		retn
  1457                                  efxsetvolume:
  1458                                  SetVolume:
  1459 000009E1 80FA40                  		cmp     dl, 64
  1460 000009E4 7602                    		jbe     short OkVol
  1461 000009E6 B240                    		mov     dl, 64
  1462                                  OkVol:
  1463                                  		; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1464 000009E8 30F6                    		xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1465                                  		;mov	[edi+TrackInfo.Volume], dl
  1466 000009EA 6689570E                		mov	[edi+TrackInfo.Volume], dx 
  1467 000009EE C3                      		retn
  1468                                  efxbreak:
  1469                                  Break:
  1470 000009EF 88D6                    		mov     dh, dl
  1471 000009F1 80E20F                  		and     dl, 0Fh
  1472 000009F4 C0EE04                  		shr     dh, 4
  1473 000009F7 00F6                    		add     dh, dh
  1474 000009F9 00F2                    		add     dl, dh
  1475 000009FB C0E602                  		shl     dh, 2
  1476 000009FE 00F2                    		add     dl, dh
  1477 00000A00 8815[2D820000]          		mov     [BreakRow], dl
  1478 00000A06 C605[2C820000]40        		mov     byte [Row], 64
  1479 00000A0D C3                      		retn
  1480                                  efxsetspeed:
  1481                                  SetSpeed:
  1482 00000A0E 84D2                    		test    dl,dl
  1483 00000A10 7432                    		je      Skip
  1484 00000A12 80FA1F                  		cmp     dl,31
  1485 00000A15 770D                    		ja      short SetBpm
  1486                                  SetTempo:       
  1487 00000A17 8815[29820000]          		mov     [Tempo], dl
  1488 00000A1D 8815[2A820000]          		mov     [TempoWait], dl
  1489 00000A23 C3                      		retn
  1490                                  SetBpm:
  1491 00000A24 8815[2B820000]          		mov     [Bpm], dl
  1492 00000A2A B067                    		mov     al, 103
  1493 00000A2C F6E2                    		mul     dl
  1494 00000A2E 88E3                    		mov     bl, ah
  1495 00000A30 30FF                    		xor     bh, bh
  1496 00000A32 66A1[2A100000]          		mov     ax, [MixSpeed]
  1497 00000A38 6631D2                  		xor     dx, dx
  1498 00000A3B 66F7F3                  		div     bx
  1499 00000A3E 66A3[2E820000]          		mov     [BpmSamples], ax
  1500                                  Skip:           
  1501 00000A44 C3                      		retn
  1502                                  efxarpeggio:
  1503                                  		; 01/10/2017
  1504 00000A45 84D2                    		test    dl, dl
  1505                                  		;je	efxnull
  1506 00000A47 74FB                    		je	short Skip
  1507                                  InitArpeggio:
  1508 00000A49 88D6                    		mov     dh, dl
  1509 00000A4B 80E20F                  		and     dl, 0Fh
  1510 00000A4E C0EE04                  		shr     dh, 4
  1511                                  		; 01/10/2017
  1512                                  		;mov	cx, 36
  1513 00000A51 66B95400                		mov	cx, 84 ; 84 notes/periods
  1514 00000A55 31DB                    		xor     ebx, ebx
  1515 00000A57 668B4710                		mov     ax, [edi+TrackInfo.Period]
  1516                                  gt_ScanPeriod:
  1517                                  		;cmp	ax, [PeriodTable+bx]
  1518 00000A5B 663B83[040E0000]        		cmp	ax, [PeriodTable+ebx]
  1519 00000A62 7306                    		jae     short SetArp
  1520 00000A64 6683C302                		add     bx, 2
  1521 00000A68 E2F1                    		loop    gt_ScanPeriod
  1522                                  SetArp:         
  1523 00000A6A 6601D2                  		add     dx, dx
  1524 00000A6D 00DE                    		add     dh, bl
  1525 00000A6F 00DA                    		add     dl, bl
  1526                                  		; 01/10/2017
  1527                                  		;mov	bx, [PeriodTable+bx]
  1528 00000A71 668B9B[040E0000]        		mov	bx, [PeriodTable+ebx]
  1529                                  		;add	bx, bx
  1530 00000A78 01DB                    		add	ebx, ebx
  1531                                  		;mov	ax, [PitchTable+bx]
  1532 00000A7A 668B83[66160000]        		mov	ax, [PitchTable+ebx]
  1533 00000A81 6689471E                		mov     [edi+TrackInfo.Arp], ax
  1534 00000A85 88F3                    		mov     bl, dh
  1535 00000A87 30FF                    		xor     bh, bh
  1536 00000A89 668B9B[040E0000]        		mov	bx, [PeriodTable+ebx]
  1537                                  		;add	bx, bx
  1538 00000A90 01DB                    		add	ebx, ebx
  1539                                  		;mov	ax, [PitchTable+bx]
  1540 00000A92 668B83[66160000]        		mov	ax, [PitchTable+ebx]
  1541 00000A99 66894720                		mov     [edi+TrackInfo.Arp+2], ax
  1542 00000A9D 88D3                    		mov     bl, dl
  1543 00000A9F 30FF                    		xor     bh, bh
  1544 00000AA1 668B9B[040E0000]        		mov	bx, [PeriodTable+ebx]
  1545                                  		;add	bx, bx
  1546 00000AA8 01DB                    		add	ebx, ebx
  1547                                  		;mov	ax, [PitchTable+bx]
  1548 00000AAA 668B83[66160000]        		mov	ax, [PitchTable+ebx]
  1549 00000AB1 66894722                		mov     [edi+TrackInfo.Arp+4], ax
  1550 00000AB5 66C747240000            		mov     word [edi+TrackInfo.ArpIndex], 0
  1551 00000ABB C3                      		retn
  1552                                  
  1553                                  efxtremolo:
  1554                                  		; 01/10/2017 (TMODPLAY.ASM)
  1555                                  InitTremolo:
  1556 00000ABC 8A471C                  		mov     al, [edi+TrackInfo.TremParm]
  1557 00000ABF 88C4                    		mov     ah, al
  1558 00000AC1 66250FF0                		and     ax, 0F00Fh
  1559 00000AC5 F6C20F                  		test    dl, 0Fh
  1560 00000AC8 7502                    		jnz     short InitTremolo_1 ; efxtremolof0
  1561 00000ACA 08C2                    		or      dl, al
  1562                                  efxtremolof0:
  1563                                  InitTremolo_1: 
  1564 00000ACC F6C2F0                  		test    dl, 0F0h
  1565 00000ACF 7502                    		jnz     short InitTremolo_2 ; efxtremolof1
  1566 00000AD1 08E2                    		or      dl, ah
  1567                                  efxtremolof1:
  1568                                  InitTremolo_2:
  1569 00000AD3 88571C                  		mov     [edi+TrackInfo.TremParm], dl
  1570 00000AD6 66895714                		mov     [edi+TrackInfo.Effect], dx
  1571 00000ADA C3                      		retn
  1572                                  
  1573                                  ;--------------------------------------------------------------------------
  1574                                  ; pollmodule - polls the module player
  1575                                  ;--------------------------------------------------------------------------
  1576                                  ;--------------------------------------------------------------------------
  1577                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1578                                  ;--------------------------------------------------------------------------
  1579                                  
  1580                                  pollmodule:
  1581                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1582 00000ADB FE0D[2A820000]          		dec     byte [TempoWait]
  1583 00000AE1 7417                    		jz      short GetTracks
  1584                                  
  1585                                  		;mov	ecx, NumTracks
  1586 00000AE3 0FB70D[17100000]        		movzx	ecx, word [numtracks] ; 06/10/2017
  1587 00000AEA BF[44820000]            		mov	edi, Tracks
  1588                                  BeatTracks:
  1589 00000AEF E86EFCFFFF              		call	BeatTrack	
  1590 00000AF4 83C726                  		add	edi, TrackInfo.size
  1591 00000AF7 E2F6                    		loop	BeatTracks
  1592 00000AF9 C3                      		retn
  1593                                  GetTracks:
  1594 00000AFA A0[29820000]            		mov     al, [Tempo]
  1595 00000AFF A2[2A820000]            		mov     [TempoWait], al
  1596                                  
  1597 00000B04 8B35[3A820000]          		mov	esi, [Note]
  1598 00000B0A 803D[2C820000]40        		cmp     byte [Row], 64
  1599 00000B11 7268                    		jb      short NoPattWrap
  1600                                  
  1601 00000B13 8B35[EE140000]          		mov	esi, [ModInfo.Patterns]
  1602 00000B19 8A1D[28820000]          		mov     bl, [OrderPos]
  1603 00000B1F 3A1D[6C140000]          		cmp     bl, [ModInfo.OrderLen]
  1604 00000B25 7214                    		jb      short NoOrderWrap
  1605 00000B27 8A1D[6D140000]          		mov     bl, [ModInfo.ReStart]
  1606 00000B2D 881D[28820000]          		mov     [OrderPos], bl
  1607 00000B33 3A1D[6C140000]          		cmp     bl, [ModInfo.OrderLen]
  1608 00000B39 7364                    		jae     short NoUpdate
  1609                                  NoOrderWrap:    
  1610                                  		;xor	bh, bh
  1611 00000B3B 81E3FF000000            		and	ebx, 0FFh
  1612 00000B41 8A9B[6E140000]          		mov     bl, [ModInfo.Order+ebx]
  1613                                  		; 05/10/2017
  1614                                  		;shl	ebx, 10 ; *1024
  1615 00000B47 8A0D[16100000]          		mov	cl, [pattern_shift] ; 10 or 11
  1616 00000B4D D3E3                    		shl	ebx, cl ; *1024 or *2048
  1617                                  		;
  1618 00000B4F 01DE                    		add     esi, ebx
  1619 00000B51 8A1D[2D820000]          		mov     bl, [BreakRow]
  1620 00000B57 881D[2C820000]          		mov     [Row], bl
  1621                                  		;xor	bh, bh
  1622 00000B5D 81E3FF000000            		and	ebx, 0FFh
  1623 00000B63 883D[2D820000]          		mov     [BreakRow], bh ; 0
  1624 00000B69 66C1E304                		shl     bx, 4
  1625 00000B6D 01DE                    		add     esi, ebx
  1626 00000B6F 8935[3A820000]          		mov     [Note], esi
  1627 00000B75 FE05[28820000]          		inc     byte [OrderPos]
  1628                                  NoPattWrap:     
  1629 00000B7B FE05[2C820000]          		inc     byte [Row]
  1630                                  
  1631                                  		;cld
  1632                                  		;mov	ecx, NumTracks
  1633 00000B81 0FB70D[17100000]        		movzx	ecx, word [numtracks] ; 06/10/2017
  1634 00000B88 BF[44820000]            		mov	edi, Tracks
  1635                                  GetTracks_next:
  1636 00000B8D 51                      		push	ecx		
  1637 00000B8E E858FDFFFF              		call	GetTrack ; readchannel
  1638 00000B93 59                      		pop	ecx
  1639 00000B94 83C726                  		add	edi, TrackInfo.size
  1640 00000B97 E2F4                    		loop	GetTracks_next
  1641                                  
  1642 00000B99 8935[3A820000]          		mov     [Note], esi
  1643                                  NoUpdate:
  1644 00000B9F C3                      		retn
  1645                                  
  1646                                  ;--------------------------------------------------------------------------
  1647                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1648                                  ;  In:
  1649                                  ;   ds:si -  Track Info Address.
  1650                                  ;   ds:di -  Buffer Address.
  1651                                  ;    cx   -  Buffer Size.
  1652                                  ;--------------------------------------------------------------------------
  1653                                  
  1654                                  ; esi = Track info address
  1655                                  ; edi = Buffer address
  1656                                  ; ecx = Buffer size
  1657                                  
  1658                                  MixTrack:
  1659 00000BA0 66837E0C02              		cmp     word [esi+TrackInfo.RepLen], 2
  1660 00000BA5 7752                    		ja      short MixLooped
  1661                                  MixNonLooped:   
  1662 00000BA7 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1663 00000BA9 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1664 00000BAC 0FB76E08                		movzx   ebp, word [esi+TrackInfo.Len]
  1665 00000BB0 52                      		push    edx
  1666 00000BB1 56                      		push    esi
  1667 00000BB2 01D3                    		add     ebx, edx
  1668 00000BB4 01D5                    		add     ebp, edx
  1669 00000BB6 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1670                                  		; 01/10/2017
  1671                                  		;mov	al, [esi+TrackInfo.Volume]
  1672 00000BBA 668B460E                		mov	ax, [esi+TrackInfo.Volume]
  1673                                  		; ah = [esi+TrackInfo.VolDiff]
  1674 00000BBE 00E0                    		add	al, ah ; ****** 
  1675 00000BC0 C6460F00                		mov	byte [esi+TrackInfo.VolDiff], 0
  1676 00000BC4 8A661D                  		mov     ah, [esi+TrackInfo.Error]
  1677 00000BC7 89DE                    		mov     esi, ebx
  1678 00000BC9 31DB                    		xor	ebx, ebx ; 01/10/2017 ; *
  1679 00000BCB 88C7                    		mov     bh, al
  1680 00000BCD 88D0                    		mov     al, dl
  1681 00000BCF 88F2                    		mov     dl, dh
  1682                                  		;xor	dh, dh
  1683 00000BD1 81E2FF000000            		and	edx, 0FFh
  1684                                  nlMixSamp:      
  1685 00000BD7 39EE                    		cmp     esi, ebp
  1686 00000BD9 7311                    		jae     short nlMixBye
  1687 00000BDB 8A1E                    		mov     bl, [esi]
  1688                                  		;mov	bl, [VolTable+bx]
  1689 00000BDD 8A9B[28310000]          		mov	bl, [VolTable+ebx] ; 01/10/2017 ; *		
  1690 00000BE3 001F                    		add     [edi], bl
  1691 00000BE5 47                      		inc     edi
  1692 00000BE6 00C4                    		add     ah, al
  1693 00000BE8 11D6                    		adc     esi, edx
  1694 00000BEA E2EB                    		loop    nlMixSamp
  1695                                  nlMixBye:       
  1696 00000BEC 89F3                    		mov     ebx, esi
  1697 00000BEE 5E                      		pop     esi
  1698 00000BEF 5A                      		pop     edx
  1699 00000BF0 29D3                    		sub     ebx, edx
  1700 00000BF2 895E04                  		mov     [esi+TrackInfo.Position], ebx
  1701 00000BF5 88661D                  		mov     [esi+TrackInfo.Error], ah
  1702 00000BF8 C3                      		retn
  1703                                  MixLooped:
  1704 00000BF9 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1705 00000BFB 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1706 00000BFE 0FB76E0C                		movzx	ebp, word [esi+TrackInfo.RepLen]
  1707 00000C02 892D[36820000]          		mov     [BufRep], ebp
  1708 00000C08 036E0A                  		add     ebp, [esi+TrackInfo.Repeat]
  1709 00000C0B 52                      		push    edx
  1710 00000C0C 56                      		push    esi
  1711 00000C0D 01D3                    		add     ebx, edx
  1712 00000C0F 01D5                    		add     ebp, edx
  1713 00000C11 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1714                                  		; 01/10/2017
  1715                                  		;mov	al, [esi+TrackInfo.Volume]
  1716 00000C15 668B460E                		mov	ax, [esi+TrackInfo.Volume]
  1717                                  		; ah = [esi+TrackInfo.VolDiff]
  1718 00000C19 00E0                    		add	al, ah ; ****** 
  1719 00000C1B C6460F00                		mov	byte [esi+TrackInfo.VolDiff], 0
  1720 00000C1F 8A661D                  		mov     ah, [esi+TrackInfo.Error]
  1721                                  		;mov	si, bx
  1722 00000C22 89DE                    		mov	esi, ebx ; 04/09/2017
  1723 00000C24 31DB                    		xor	ebx, ebx ; 01/10/2017 ; *
  1724 00000C26 88C7                    		mov     bh, al
  1725 00000C28 88D0                    		mov     al, dl
  1726 00000C2A 88F2                    		mov     dl, dh
  1727                                  		;xor	dh, dh
  1728 00000C2C 81E2FF000000            		and	edx, 0FFh
  1729                                  lpMixSamp:      
  1730 00000C32 39EE                    		cmp     esi, ebp
  1731 00000C34 7206                    		jb      short lpMixNow
  1732 00000C36 2B35[36820000]          		sub     esi, [BufRep]
  1733                                  lpMixNow:       
  1734 00000C3C 8A1E                    		mov     bl, [esi]
  1735                                  		;mov	bl, [VolTable+bx]
  1736 00000C3E 8A9B[28310000]          		mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1737 00000C44 001F                    		add     [edi], bl
  1738 00000C46 47                      		inc     edi
  1739 00000C47 00C4                    		add     ah, al
  1740 00000C49 11D6                    		adc	esi, edx
  1741 00000C4B E2E5                    		loop    lpMixSamp
  1742                                  lpMixBye:       
  1743                                  ;		mov     ebx, esi
  1744                                  ;		pop     esi
  1745                                  ;		pop     edx
  1746                                  ;		sub     ebx, edx
  1747                                  ;		mov     [esi+TrackInfo.Position], ebx
  1748                                  ;		mov     [esi+TrackInfo.Error], ah
  1749                                  ;		retn
  1750 00000C4D EB9D                    		jmp	short nlMixBye
  1751                                  
  1752                                  ;--------------------------------------------------------------------------
  1753                                  ; mixpoll - updates the output buffer
  1754                                  ;--------------------------------------------------------------------------
  1755                                  ;
  1756                                  ;--------------------------------------------------------------------------
  1757                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1758                                  ;  In:
  1759                                  ;    Buffer  - Buffer Address.
  1760                                  ;    Count   - Buffer Size.
  1761                                  ;--------------------------------------------------------------------------
  1762                                  
  1763                                  mixpoll:
  1764                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1765                                  		; edi = buffer address
  1766                                  		; ebx = count
  1767                                  
  1768 00000C4F 60                      		pushad
  1769                                  
  1770                                  		;cld
  1771                                  NextChunk:      
  1772 00000C50 66833D[34820000]00      		cmp     word [BufLen], 0
  1773 00000C58 754A                    		jne     short CopyChunk
  1774                                  
  1775 00000C5A 53                      		push    ebx
  1776 00000C5B 57                      		push    edi
  1777                                  MixChunk:       
  1778 00000C5C BF[28720000]            		mov	edi, MixBuffer
  1779 00000C61 0FB70D[2E820000]        		movzx	ecx, word [BpmSamples]
  1780                                  		;mov	cx, [BpmSamples]
  1781 00000C68 893D[30820000]          		mov     [BufPtr], edi
  1782 00000C6E 66890D[34820000]        		mov     [BufLen], cx
  1783                                  
  1784 00000C75 B080                    		mov     al, 80h
  1785 00000C77 F3AA                    		rep     stosb
  1786                                  
  1787                                  		;mov	cx, NumTracks
  1788                                  		;mov	cl, NumTracks ; 01/10/2017
  1789 00000C79 8A0D[17100000]          		mov	cl, [numtracks] ; 06/10/2017
  1790 00000C7F BE[1E820000]            		mov	esi, Tracks - TrackInfo.size
  1791                                  GetSamples_next:
  1792 00000C84 51                      		push	ecx
  1793 00000C85 83C626                  		add	esi, TrackInfo.size
  1794 00000C88 668B0D[34820000]        		mov	cx, [BufLen]
  1795 00000C8F 8B3D[30820000]          		mov	edi, [BufPtr]
  1796 00000C95 E806FFFFFF              		call	MixTrack
  1797 00000C9A 59                      		pop	ecx
  1798 00000C9B E2E7                    		loop	GetSamples_next		
  1799                                  
  1800 00000C9D E839FEFFFF              		call    UpdateTracks
  1801                                  
  1802 00000CA2 5F                      		pop     edi
  1803 00000CA3 5B                      		pop     ebx
  1804                                  CopyChunk:      
  1805                                  		;mov	cx, [BufLen]
  1806 00000CA4 0FB70D[34820000]        		movzx	ecx, word [BufLen]
  1807 00000CAB 39D9                    		cmp	ecx, ebx
  1808                                  		;cmp	cx, bx
  1809 00000CAD 7602                    		jbe     short MoveChunk
  1810                                  		;mov	cx, bx
  1811 00000CAF 89D9                    		mov     ecx, ebx
  1812                                  MoveChunk:
  1813 00000CB1 8B35[30820000]          		mov     esi, [BufPtr]
  1814 00000CB7 010D[30820000]          		add     [BufPtr], ecx
  1815 00000CBD 66290D[34820000]        		sub     [BufLen], cx
  1816 00000CC4 29CB                    		sub     ebx, ecx
  1817 00000CC6 F3A4                    		rep     movsb
  1818 00000CC8 85DB                    		test    ebx, ebx
  1819 00000CCA 7584                    		jnz     short NextChunk
  1820                                  
  1821 00000CCC 61                      		popad
  1822 00000CCD C3                      		retn
  1823                                  
  1824                                  ;--------------------------------------------------------------------------
  1825                                  ; StartPlaying: Initializes the Sound System.
  1826                                  ;  In:
  1827                                  ;   Module Information Resources.
  1828                                  ;--------------------------------------------------------------------------
  1829                                  
  1830                                  StartPlaying:
  1831 00000CCE 60                      		pushad
  1832                                  SetModParms:    
  1833 00000CCF C605[28820000]00        		mov     byte [OrderPos], 0
  1834 00000CD6 C605[29820000]06        		mov     byte [Tempo], DefTempo
  1835 00000CDD C605[2A820000]06        		mov     byte [TempoWait], DefTempo
  1836 00000CE4 C605[2B820000]7D        		mov     byte [Bpm], DefBpm
  1837 00000CEB C605[2C820000]40        		mov     byte [Row], 64
  1838 00000CF2 C605[2D820000]00        		mov     byte [BreakRow], 0
  1839 00000CF9 66A1[2A100000]          		mov     ax, [MixSpeed]
  1840 00000CFF 31D2                    		xor     edx, edx
  1841 00000D01 66BB3200                		mov     bx, 24*DefBpm/60
  1842 00000D05 66F7F3                  		div     bx
  1843 00000D08 66A3[2E820000]          		mov     [BpmSamples], ax
  1844                                  ClearTracks:    
  1845 00000D0E BF[44820000]            		mov     edi, Tracks
  1846                                  		; 06/10/2017
  1847                                  		;mov	ecx, NumTracks*TrackInfo.size
  1848 00000D13 B826000000              		mov	eax, TrackInfo.size
  1849 00000D18 0FB70D[17100000]        		movzx	ecx, word [numtracks]
  1850 00000D1F F7E1                    		mul	ecx
  1851 00000D21 89C1                    		mov	ecx, eax
  1852 00000D23 31C0                    		xor	eax, eax
  1853                                  		;cld
  1854 00000D25 F3AA                    		rep     stosb
  1855                                  
  1856 00000D27 A3[30820000]            		mov     [BufPtr], eax
  1857 00000D2C 66A3[34820000]          		mov     [BufLen], ax
  1858                                  MakePitch:
  1859 00000D32 66B80021                		mov     ax, MidCRate
  1860 00000D36 66BBAC01                		mov     bx, 428
  1861 00000D3A 66F7E3                  		mul     bx
  1862 00000D3D 66F735[2A100000]        		div     word [MixSpeed]
  1863 00000D44 30F6                    		xor     dh, dh
  1864 00000D46 88E2                    		mov     dl, ah
  1865 00000D48 88C4                    		mov     ah, al
  1866 00000D4A 30C0                    		xor     al, al
  1867                                  		;mov	cx, 857
  1868 00000D4C 66B9610D                		mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1869 00000D50 31DB                    		xor     ebx, ebx
  1870 00000D52 BF[66160000]            		mov     edi, PitchTable
  1871                                  PitchLoop:      
  1872 00000D57 50                      		push    eax
  1873 00000D58 52                      		push    edx
  1874 00000D59 6639DA                  		cmp     dx, bx
  1875 00000D5C 7303                    		jae     short NoDiv
  1876 00000D5E 66F7F3                  		div     bx
  1877                                  NoDiv:          
  1878 00000D61 66AB                    		stosw
  1879 00000D63 5A                      		pop     edx
  1880 00000D64 58                      		pop     eax
  1881                                  		;inc	bx
  1882 00000D65 43                      		inc	ebx
  1883 00000D66 E2EF                    		loop    PitchLoop
  1884                                  MakeVolume:     
  1885 00000D68 66B90041                		mov     cx, 16640
  1886 00000D6C 89CB                    		mov     ebx, ecx
  1887                                  VolLoop:
  1888 00000D6E 664B                    		dec     bx
  1889 00000D70 88D8                    		mov     al, bl
  1890 00000D72 F6EF                    		imul    bh
  1891                                  		;mov	[VolTable+bx], ah
  1892 00000D74 88A3[28310000]          		mov     [VolTable+ebx], ah
  1893 00000D7A E2F2                    		loop    VolLoop
  1894                                  
  1895 00000D7C 61                      		popad
  1896                                  		;retn
  1897                                  
  1898                                  ;--------------------------------------------------------------------------
  1899                                  ; StopPlaying: ShutDown the Sound System.
  1900                                  ;--------------------------------------------------------------------------
  1901                                  
  1902                                  StopPlaying:
  1903 00000D7D C3                      		retn
  1904                                  
  1905                                  ;=============================================================================
  1906                                  ;               preinitialized data
  1907                                  ;=============================================================================
  1908                                  
  1909                                  ;=============================================================================
  1910                                  ;               SB.ASM - DATA
  1911                                  ;=============================================================================
  1912                                  
  1913 00000D7E 2002                    SbAddr:		dw      220h
  1914 00000D80 07                      SbIrq:		db      7
  1915                                  ;Srbs:		db	0 
  1916                                  
  1917                                  ;=============================================================================
  1918                                  ; Protracker effects stuff
  1919                                  ;=============================================================================
  1920                                  
  1921                                  ;-----------------------------------------------------------------------------
  1922                                  ; Effect jump tables
  1923                                  ;-----------------------------------------------------------------------------
  1924                                  
  1925 00000D81 90<rept>                align 4
  1926                                  
  1927                                  efxtable:
  1928 00000D84 [450A0000]              	dd      efxarpeggio	; 0 - arpeggio
  1929 00000D88 [72070000]              	dd      efxnull		; 1 - porta up
  1930 00000D8C [72070000]              	dd      efxnull		; 2 - porta down
  1931 00000D90 [90090000]              	dd      efxtoneporta	; 3 - tone porta
  1932 00000D94 [9F090000]              	dd      efxvibrato	; 4 - vibrato
  1933 00000D98 [72070000]              	dd      efxnull		; 5 - tone+slide
  1934 00000D9C [72070000]              	dd      efxnull		; 6 - vibrato+slide
  1935 00000DA0 [BC0A0000]              	dd      efxtremolo	; 7 - tremolo
  1936 00000DA4 [72070000]              	dd      efxnull		; 8 - unused
  1937 00000DA8 [C7090000]              	dd      efxsampoffset	; 9 - sample offset
  1938 00000DAC [72070000]              	dd      efxnull		; A - volume slide
  1939 00000DB0 [D3090000]              	dd      efxpattjump	; B - pattern jump
  1940 00000DB4 [E1090000]              	dd      efxsetvolume	; C - set volume
  1941 00000DB8 [EF090000]              	dd      efxbreak	; D - break pattern
  1942 00000DBC [72070000]              	dd      efxnull		; E - extra effects
  1943 00000DC0 [0E0A0000]              	dd      efxsetspeed	; F - set speed
  1944                                  
  1945                                  efxtable2:
  1946 00000DC4 [73070000]              	dd      efxarpeggio2	; 0 - arpeggio
  1947 00000DC8 [95070000]              	dd      efxportaup	; 1 - porta up
  1948 00000DCC [BB070000]              	dd      efxportadown	; 2 - porta down
  1949 00000DD0 [E2070000]              	dd      efxtoneporta2	; 3 - tone porta
  1950 00000DD4 [1B080000]              	dd      efxvibrato2	; 4 - vibrato
  1951 00000DD8 [77080000]              	dd      efxtoneslide	; 5 - tone+slide
  1952 00000DDC [84080000]              	dd      efxvibslide	; 6 - vibrato+slide
  1953 00000DE0 [AB080000]              	dd      efxtremolo2	; 7 - tremolo
  1954 00000DE4 [72070000]              	dd      efxnull		; 8 - unused
  1955 00000DE8 [72070000]              	dd      efxnull		; 9 - sample offset
  1956 00000DEC [8E080000]              	dd      efxvolslide	; A - volume slide
  1957 00000DF0 [72070000]              	dd      efxnull		; B - pattern jump
  1958 00000DF4 [72070000]              	dd      efxnull		; C - set volume
  1959 00000DF8 [72070000]              	dd      efxnull		; D - break pattern
  1960 00000DFC [72070000]              	dd      efxnull		; E - extra effects
  1961 00000E00 [72070000]              	dd      efxnull		; F - set speed
  1962                                  
  1963                                  ;-----------------------------------------------------------------------------
  1964                                  ; Amiga period table
  1965                                  ;-----------------------------------------------------------------------------
  1966                                  
  1967                                  ;PeriodTable0:	
  1968                                  ;	dw	0
  1969                                  PeriodTable:
  1970 00000E04 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1970 00000E0D 0A000A7009E8086808-
  1970 00000E16 F00780071407       
  1971 00000E1C B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1971 00000E25 050005B80474043404-
  1971 00000E2E F803C0038A03       
  1972 00000E34 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1972 00000E3D 0280025C023A021A02-
  1972 00000E46 FC01E001C501       
  1973 00000E4C AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1973 00000E55 0140012E011D010D01-
  1973 00000E5E FE00F000E200       
  1974 00000E64 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1974 00000E6D 00A00097008F008700-
  1974 00000E76 7F0078007100       
  1975 00000E7C 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1975 00000E85 0050004B0047004300-
  1975 00000E8E 3F003C003800       
  1976 00000E94 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1976 00000E9D 002800250023002100-
  1976 00000EA6 1F001E001C00       
  1977                                  
  1978                                  ;-----------------------------------------------------------------------------
  1979                                  ; Sinus wave table
  1980                                  ;-----------------------------------------------------------------------------
  1981                                  
  1982                                  SinTable:
  1983 00000EAC 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1983 00000EB5 C5D4E1             
  1984 00000EB8 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1984 00000EC1 E1                 
  1985 00000EC2 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1985 00000ECB 19                 
  1986                                  
  1987                                  ;=============================================================================
  1988                                  ; Copyright Strings & Messages
  1989                                  ;=============================================================================
  1990 00000ECC 0000                    		dw	0
  1991                                  msg_usage:
  1992 00000ECE 54696E79204D4F4420-     		db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1992 00000ED7 506C6179657220666F-
  1992 00000EE0 72205452444F532033-
  1992 00000EE9 383620627920457264-
  1992 00000EF2 6F67616E2054616E2E-
  1992 00000EFB 20                 
  1993 00000EFC 4F63746F6265722032-     		db	'October 2017.',10,13
  1993 00000F05 3031372E0A0D       
  1994 00000F0B 75736167653A207469-     		db	'usage: tinyplay filename.mod', 10, 13,0
  1994 00000F14 6E79706C6179206669-
  1994 00000F1D 6C656E616D652E6D6F-
  1994 00000F26 640A0D00           
  1995 00000F2A 30362F31302F323031-     		db	'06/10/2017',0
  1995 00000F33 3700               
  1996                                  
  1997                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1998                                  
  1999 00000F35 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1999 00000F3E 506C61796572207630-
  1999 00000F47 2E3162206279204361-
  1999 00000F50 726C6F732048617361-
  1999 00000F59 6E2E204A756C792031-
  1999 00000F62 3939332E           
  2000 00000F66 0A0D00                  		db	10,13,0
  2001 00000F69 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  2001 00000F72 64696E67204D6F6475-
  2001 00000F7B 6C652066696C652E0A-
  2001 00000F84 0D00               
  2002 00000F86 536F756E6420426C61-     MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  2002 00000F8F 73746572206E6F7420-
  2002 00000F98 666F756E64206F7220-
  2002 00000FA1 495251206572726F72-
  2002 00000FAA 2E0A0D00           
  2003 00000FAE 536F756E6420426C61-     MsgFound:	db	'Sound Blaster found at Address 2'
  2003 00000FB7 7374657220666F756E-
  2003 00000FC0 642061742041646472-
  2003 00000FC9 6573732032         
  2004 00000FCE 7830682C2049525120      PortText:	db	'x0h, IRQ '
  2005 00000FD7 782E0A0D00              IrqText:	db	'x.',10,13,0
  2006                                  
  2007                                  trdos386_err_msg:
  2008 00000FDC 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  2008 00000FE5 2053797374656D2063-
  2008 00000FEE 616C6C206572726F72-
  2008 00000FF7 20210A0D00         
  2009                                  
  2010                                  PlayMsg:
  2011 00000FFC 0D0A                    		db	0Dh, 0Ah
  2012 00000FFE 506C6179696E67206D-     		db	"Playing music... "
  2012 00001007 757369632E2E2E20   
  2013 0000100F 00                      		db	0
  2014                                  OkMsg:
  2015 00001010 4F4B2E                  		db	"OK."
  2016                                  NextLine:
  2017 00001013 0D0A00                  		db	0Dh, 0Ah, 0
  2018                                  
  2019                                  
  2020                                  ; 04/10/2017
  2021 00001016 0A                      pattern_shift:	db 10
  2022 00001017 0400                    numtracks:	dw 4
  2023                                  
  2024                                  
  2025                                  bss_start:
  2026                                  
  2027                                  ABSOLUTE bss_start
  2028                                  
  2029 00001019 <res 00000003>          alignb 4
  2030                                  
  2031                                  ;=============================================================================
  2032                                  ;        	uninitialized data
  2033                                  ;=============================================================================
  2034                                  
  2035                                  ; 02/10/2017
  2036 0000101C <res 00000004>          bar_start:	resd	1
  2037 00001020 <res 00000004>          bar_stop:	resd	1
  2038                                  ; 06/10/2017
  2039 00001024 <res 00000004>          prev_max:	resd	1
  2040                                  
  2041                                  ; SB.ASM
  2042 00001028 <res 00000001>          DmaFlag		resb 1		
  2043                                  
  2044                                  ; 11/03/2017
  2045 00001029 <res 00000001>          iStatus:	resb 1
  2046                                  
  2047                                  ; MODPLAY.ASM
  2048                                  sampling_rate:	; 06/10/2017
  2049 0000102A <res 00000002>          MixSpeed:	resw 1
  2050                                  
  2051                                  ; MODLOAD.ASM
  2052 0000102C <res 00000004>          FileHandle:	resd 1
  2053 00001030 <res 0000043C>          Header:		resb ModHeader.size
  2054                                  
  2055                                  ; MODPLAY.ASM
  2056                                  ;sampling_rate:	; 11/03/2017
  2057                                  ;MixSpeed:	resw 1
  2058                                  
  2059                                  ModInfo:
  2060 0000146C <res 00000001>          ModInfo.OrderLen:   resb 1
  2061 0000146D <res 00000001>          ModInfo.ReStart:    resb 1
  2062 0000146E <res 00000080>          ModInfo.Order:	    resb 128
  2063 000014EE <res 00000004>          ModInfo.Patterns:   resd 1
  2064                                  
  2065 000014F2 <res 0000003E>          ModInfo.SampOfs:    resw 31
  2066 00001530 <res 0000003E>          ModInfo.SampSeg:    resw 31
  2067 0000156E <res 0000003E>          ModInfo.SampLen:    resw 31
  2068 000015AC <res 0000003E>          ModInfo.SampRep:    resw 31
  2069 000015EA <res 0000003E>          ModInfo.SampRepLen: resw 31
  2070 00001628 <res 0000003E>          ModInfo.SampVol:    resw 31
  2071                                  
  2072                                  ; MODPLAY.ASM
  2073                                  PitchTable:	;resw 857
  2074 00001666 <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2075 00003128 <res 00004100>          VolTable:	resb 16640
  2076 00007228 <res 00001000>          MixBuffer       resb MixBufSize
  2077                                  
  2078                                  ; MODPLAY.ASM
  2079 00008228 <res 00000001>          OrderPos:	resb 1
  2080 00008229 <res 00000001>          Tempo:		resb 1
  2081 0000822A <res 00000001>          TempoWait:	resb 1
  2082 0000822B <res 00000001>          Bpm:		resb 1
  2083 0000822C <res 00000001>          Row:		resb 1
  2084 0000822D <res 00000001>          BreakRow:	resb 1
  2085 0000822E <res 00000002>          BpmSamples:	resw 1
  2086 00008230 <res 00000004>          BufPtr:		resd 1
  2087 00008234 <res 00000002>          BufLen:		resw 1
  2088 00008236 <res 00000004>          BufRep:		resd 1
  2089 0000823A <res 00000004>          Note:		resd 1
  2090                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2091                                  
  2092 0000823E <res 00000002>          alignb 4
  2093                                  
  2094                                  ;03/03/2017
  2095 00008240 <res 00000004>          DMA_phy_buff:	resd 1
  2096                                  
  2097                                  ; 06/10/2017
  2098 00008244 <res 00000130>          Tracks:		resb TrackInfo.size*8
  2099                                  
  2100                                  mod_file_name:
  2101 00008374 <res 00000010>          		resb 16
  2102                                  
  2103                                  ; 12/03/2017
  2104 00008384 <res 00007C7C>          alignb 65536
  2105                                  
  2106                                  DmaBuffer:
  2107 00010000 <res 00010000>          DoubleBuffer:	resb DmaBufSize ; 2048-65536 ; 06/10/2017
  2108                                  
  2109                                  alignb 65536
  2110                                  
  2111                                  file_buffer:
  2112 00020000 <res 00060000>          		resb 65536*6 ; 13/03/2017
  2113                                  EOF:
