     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: 07/10/2017 ]
     9                                  ;
    10                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    11                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    12                                  ;
    13                                  ; Assembler: NASM 2.11
    14                                  ; ----------------------------------------------------------------------------
    15                                  ;	   nasm  tinyplay.s -l tinyplay.txt -o TINYPLAY.PRG	
    16                                  ; ****************************************************************************
    17                                  ; TINYPLAY.ASM by Erdogan Tan (for MSDOS) (13/02/2017)
    18                                  ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    19                                  
    20                                  ; 01/03/2017
    21                                  ; 16/10/2016
    22                                  ; 29/04/2016
    23                                  ; TRDOS 386 system calls (temporary list!)
    24                                  _ver 	equ 0
    25                                  _exit 	equ 1
    26                                  _fork 	equ 2
    27                                  _read 	equ 3
    28                                  _write	equ 4
    29                                  _open	equ 5
    30                                  _close 	equ 6
    31                                  _wait 	equ 7
    32                                  _creat 	equ 8
    33                                  _link 	equ 9
    34                                  _unlink	equ 10
    35                                  _exec	equ 11
    36                                  _chdir	equ 12
    37                                  _time 	equ 13
    38                                  _mkdir 	equ 14
    39                                  _chmod	equ 15
    40                                  _chown	equ 16
    41                                  _break	equ 17
    42                                  _stat	equ 18
    43                                  _seek	equ 19
    44                                  _tell 	equ 20
    45                                  _mount	equ 21
    46                                  _umount	equ 22
    47                                  _setuid	equ 23
    48                                  _getuid	equ 24
    49                                  _stime	equ 25
    50                                  _quit	equ 26	
    51                                  _intr	equ 27
    52                                  _fstat	equ 28
    53                                  _emt 	equ 29
    54                                  _mdate 	equ 30
    55                                  _video 	equ 31
    56                                  _audio	equ 32
    57                                  _timer	equ 33
    58                                  _sleep	equ 34
    59                                  _msg    equ 35
    60                                  _geterr	equ 36
    61                                  _fpsave	equ 37
    62                                  _pri	equ 38
    63                                  _rele	equ 39
    64                                  _fff	equ 40
    65                                  _fnf	equ 41
    66                                  _alloc	equ 42
    67                                  _dalloc equ 43
    68                                  _calbac equ 44				
    69                                  
    70                                  %macro sys 1-4
    71                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    72                                      ; 03/09/2015	
    73                                      ; 13/04/2015
    74                                      ; Retro UNIX 386 v1 system call.		
    75                                      %if %0 >= 2   
    76                                          mov ebx, %2
    77                                          %if %0 >= 3    
    78                                              mov ecx, %3
    79                                              %if %0 = 4
    80                                                 mov edx, %4   
    81                                              %endif
    82                                          %endif
    83                                      %endif
    84                                      mov eax, %1
    85                                      ;int 30h
    86                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    87                                  %endmacro
    88                                  
    89                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    90                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    91                                  
    92                                  
    93                                  ; ----------------------------------------------------------------------------
    94                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
    95                                  ;		July 14th, 1993.
    96                                  
    97                                  ;=============================================================================
    98                                  ;               PLAY.ASM
    99                                  ;=============================================================================
   100                                  
   101                                  [BITS 32]
   102                                  [org 0]
   103                                  
   104                                  Start:
   105                                  		; clear bss
   106 00000000 B9[00000800]            		mov	ecx, EOF
   107 00000005 BF[5C0F0000]            		mov	edi, bss_start
   108 0000000A 29F9                    		sub	ecx, edi
   109 0000000C D1E9                    		shr	ecx, 1
   110 0000000E 31C0                    		xor	eax, eax
   111 00000010 F366AB                  		rep	stosw
   112                                  
   113                                  GetFileName:  
   114 00000013 89E6                    		mov	esi, esp
   115 00000015 AD                      		lodsd
   116 00000016 83F802                  		cmp	eax, 2 ; two arguments 
   117                                  			       ; (program file name & mod file name)
   118 00000019 0F82A4010000            		jb	pmsg_usage ; nothing to do
   119                                  
   120 0000001F AD                      		lodsd ; program file name address 
   121 00000020 AD                      		lodsd ; mod file name address (file to be read)
   122 00000021 89C6                    		mov	esi, eax
   123 00000023 BF[94860000]            		mov	edi, mod_file_name
   124                                  ScanName:       
   125 00000028 AC                      		lodsb
   126 00000029 84C0                    		test	al, al
   127 0000002B 0F8492010000            		je	pmsg_usage
   128 00000031 3C20                    		cmp	al, 20h
   129 00000033 74F3                    		je	short ScanName		; scan start of name.
   130 00000035 AA                      		stosb
   131 00000036 B4FF                    		mov	ah, 0FFh
   132                                  a_0:	
   133 00000038 FEC4                    		inc	ah
   134                                  a_1:
   135 0000003A AC                      		lodsb
   136 0000003B AA                      		stosb
   137 0000003C 3C2E                    		cmp	al, '.'
   138 0000003E 74F8                    		je	short a_0	
   139 00000040 20C0                    		and	al, al
   140 00000042 75F6                    		jnz	short a_1
   141                                  
   142 00000044 08E4                    		or	ah, ah			; if period NOT found,
   143 00000046 750B                    		jnz	short a_2		; then add a .MOD extension.
   144                                  SetExt:
   145 00000048 4F                      		dec	edi
   146 00000049 C7072E4D4F44            		mov	dword [edi], '.MOD'
   147 0000004F C6470400                		mov	byte [edi+4], 0
   148                                  a_2:
   149                                  		; Prints the Credits Text.
   150                                  		sys	_msg, Credits, 255, 0Ch
   150                              <1> 
   150                              <1> 
   150                              <1> 
   150                              <1> 
   150                              <1>  %if %0 >= 2
   150 00000053 BB[950E0000]        <1>  mov ebx, %2
   150                              <1>  %if %0 >= 3
   150 00000058 B9FF000000          <1>  mov ecx, %3
   150                              <1>  %if %0 = 4
   150 0000005D BA0C000000          <1>  mov edx, %4
   150                              <1>  %endif
   150                              <1>  %endif
   150                              <1>  %endif
   150 00000062 B823000000          <1>  mov eax, %1
   150                              <1> 
   150 00000067 CD40                <1>  int 40h
   151                                  
   152 00000069 E86D010000              		call    DetectSb		; Detect the SB Addr, Irq.
   153                                  LoadMod:  
   154 0000006E BF[94860000]            		mov	edi, mod_file_name
   155 00000073 E8F7040000              		call    LoadModule		; Load the MODule...
   156                                  		; 07/10/2017
   157 00000078 731B                    		jnc	short PlayNow		; any error loading?
   158                                  
   159                                  		; yes, print error and Exit.
   160                                  
   161                                  		sys	_msg, ErrorMesg, 255, 0Fh
   161                              <1> 
   161                              <1> 
   161                              <1> 
   161                              <1> 
   161                              <1>  %if %0 >= 2
   161 0000007A BB[C90E0000]        <1>  mov ebx, %2
   161                              <1>  %if %0 >= 3
   161 0000007F B9FF000000          <1>  mov ecx, %3
   161                              <1>  %if %0 = 4
   161 00000084 BA0F000000          <1>  mov edx, %4
   161                              <1>  %endif
   161                              <1>  %endif
   161                              <1>  %endif
   161 00000089 B823000000          <1>  mov eax, %1
   161                              <1> 
   161 0000008E CD40                <1>  int 40h
   162                                  
   163 00000090 E922010000              		jmp     Exit
   164                                  
   165                                  PlayNow: 
   166                                  		;; DIRECT MEMORY ACCESS (for Audio DMA)
   167                                  		;; ebx = DMA buffer address (virtual, user)
   168                                  		;; ecx = buffer size (in bytes)
   169                                  		;; edx = upper limit = 16MB
   170                                  
   171                                  		;_16MB	equ 1024*1024*16	
   172                                  
   173                                  		;sys	_alloc, DoubleBuffer, DmaBufSize, _16MB 
   174                                  		;jc	short error_exit
   175                                  
   176                                  		; 12/05/2017
   177                                  		sys	_audio, 0D00h, DmaBufSize, DoubleBuffer
   177                              <1> 
   177                              <1> 
   177                              <1> 
   177                              <1> 
   177                              <1>  %if %0 >= 2
   177 00000095 BB000D0000          <1>  mov ebx, %2
   177                              <1>  %if %0 >= 3
   177 0000009A B900000100          <1>  mov ecx, %3
   177                              <1>  %if %0 = 4
   177 0000009F BA[00000100]        <1>  mov edx, %4
   177                              <1>  %endif
   177                              <1>  %endif
   177                              <1>  %endif
   177 000000A4 B820000000          <1>  mov eax, %1
   177                              <1> 
   177 000000A9 CD40                <1>  int 40h
   178 000000AB 7253                    		jc	short error_exit
   179                                  
   180 000000AD A3[90860000]            		mov	[DMA_phy_buff], eax	; physical address
   181                                  					     	; of the buffer
   182                                  						; (which is needed
   183                                  						; for DMA controller)
   184                                  
   185                                  		; 11/03/2017 (22000 -> 22050)
   186 000000B2 66C705[9E130000]22-     		mov     word [MixSpeed], 22050	; Mixing at 22 kHz
   186 000000BA 56                 
   187                                  
   188                                  		; 07/10/2017
   189 000000BB 66C705[9E130000]CE-     		mov	word [MixSpeed], 22222	; Mixing at 22 kHz
   189 000000C3 56                 
   190                                  
   191                                  ;		call    StartPlaying            ; PLAY!
   192                                  
   193 000000C4 E810030000              		call    SbInit
   194                                  
   195 000000C9 B980000000              		mov     ecx, 128		; Make a lookup table
   196 000000CE 31DB                    		xor     ebx, ebx		; for fastest pixel
   197 000000D0 BA002D0000              		mov     edx, 320*(100-64)	; addressing.
   198                                  MakeOfs:        
   199 000000D5 668993[90840000]        		mov     [RowOfs+ebx], dx
   200 000000DC 668993[92840000]        		mov     [RowOfs+ebx+2], dx
   201 000000E3 6681C24001              		add     dx, 320
   202 000000E8 83C304                  		add     ebx, 4
   203 000000EB E2E8                    		loop    MakeOfs
   204                                  
   205                                  		;cld
   206                                  
   207                                  		; DIRECT VGA MEMORY ACCESS
   208                                  		; bl = 0, bh = 5
   209                                  		; Direct access/map to VGA memory (0A0000h)
   210                                  
   211                                  		sys	_video, 0500h
   211                              <1> 
   211                              <1> 
   211                              <1> 
   211                              <1> 
   211                              <1>  %if %0 >= 2
   211 000000ED BB00050000          <1>  mov ebx, %2
   211                              <1>  %if %0 >= 3
   211                              <1>  mov ecx, %3
   211                              <1>  %if %0 = 4
   211                              <1>  mov edx, %4
   211                              <1>  %endif
   211                              <1>  %endif
   211                              <1>  %endif
   211 000000F2 B81F000000          <1>  mov eax, %1
   211                              <1> 
   211 000000F7 CD40                <1>  int 40h
   212 000000F9 3D00000A00              		cmp	eax, 0A0000h
   213 000000FE 741B                    		je	short start_scope
   214                                  
   215                                  error_exit:
   216                                  		sys	_msg, trdos386_err_msg, 255, 0Eh
   216                              <1> 
   216                              <1> 
   216                              <1> 
   216                              <1> 
   216                              <1>  %if %0 >= 2
   216 00000100 BB[3C0F0000]        <1>  mov ebx, %2
   216                              <1>  %if %0 >= 3
   216 00000105 B9FF000000          <1>  mov ecx, %3
   216                              <1>  %if %0 = 4
   216 0000010A BA0E000000          <1>  mov edx, %4
   216                              <1>  %endif
   216                              <1>  %endif
   216                              <1>  %endif
   216 0000010F B823000000          <1>  mov eax, %1
   216                              <1> 
   216 00000114 CD40                <1>  int 40h
   217                                  		;jmp	short Exit
   218 00000116 E99C000000              		jmp	Exit
   219                                  		 	
   220                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   221                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   222                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   223                                  ;       second, or the module will sound "looped".
   224                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   225                                  ;       the polling is called from my routine, and then the irq 0 must be
   226                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   227                                  ;       samples played by the Sound Blaster. Note that some samples are
   228                                  ;       discarded in the next code, just for fun!
   229                                  
   230                                  start_scope:
   231                                  		; mov	ax, 0A000h
   232                                  		; mov	es, ax
   233 0000011B 89C7                    		mov	edi, eax  ; 0A0000h
   234                                  
   235                                  		;mov	byte [tLoop], 1
   236                                  	
   237                                  		; 11/03/2017
   238 0000011D 66B81300                		mov     ax, 0013h		; Set Mode 320x200x256
   239 00000121 CD31                    		int     31h
   240                                  ScopeLoop:
   241                                  		; ModPlay Polling!
   242 00000123 E884020000              		call    SbPoll
   243                                  
   244                                  		;cmp	byte [tLoop], 1
   245                                  		;jb	short _StopPlay
   246                                  
   247                                  
   248 00000128 BE[00000100]            		mov     esi, DmaBuffer		; get current samples
   249                                  						; to be drawed ...
   250                                  		; 12/03/2017
   251                                  		; original tinyplay scope drawing code is for 1K buffer
   252                                  		; but now we have 32K buffer, following code is for that...
   253                                  GetDmaCount:
   254                                  		;in	al, 03h
   255 0000012D 66BA0300                		mov	dx, 03h
   256 00000131 B400                    		mov	ah, 0 ; inb
   257 00000133 CD34                    		int	34h	
   258 00000135 88C1                    		mov	cl, al
   259                                  		;in	al, 03h
   260                                  		;mov	ah, 0 ; inb
   261 00000137 CD34                    		int	34h
   262 00000139 88C5                    		mov     ch, al
   263 0000013B 66BAFFFF                		mov	dx, 65535
   264 0000013F 6629CA                  		sub	dx, cx
   265                                  		; 15/03/2017
   266 00000142 6681EAA000              		sub	dx, 160
   267 00000147 6601D6                  		add	si, dx
   268                                  		;
   269 0000014A 6631C9                  		xor     cx, cx			
   270 0000014D 6631D2                  		xor     dx, dx
   271                                  DrawLoop:       
   272 00000150 6689D3                  		mov     bx, dx			; (save Index)
   273 00000153 66678BBF[1082]          		mov     di, [Scope+bx]		; get old SCOPE pixel address
   274                                  		;mov    byte [es:di], 0		; erase it!
   275 00000159 C60700                  		mov	byte [edi], 0
   276                                  		;lodsb				; get a sample (8-bit)
   277                                  		;mov	bl, al
   278                                  		;15/03/2017
   279 0000015C 8A1E                    		mov	bl, [esi]		; calc new pixel address...
   280 0000015E 6646                    		inc	si
   281 00000160 30FF                    		xor     bh, bh
   282 00000162 66D1E3                  		shl     bx, 1
   283 00000165 66678BBF[9084]          		mov     di, [RowOfs+bx]
   284 0000016B 6601CF                  		add     di, cx
   285 0000016E 6689D3                  		mov     bx, dx			; (restore Index)
   286 00000171 666789BF[1082]          		mov     [Scope+bx], di		; save new address...
   287                                  		;mov	byte [es:di], 10	; and DRAW.
   288 00000177 C6070A                  		mov	byte [edi], 10
   289 0000017A 6683C202                		add     dx, 2			; the next pixel...
   290 0000017E 6641                    		inc     cx
   291 00000180 6681F94001              		cmp     cx, 320			; 320 pixels drawed?
   292 00000185 72C9                    		jb      short DrawLoop
   293                                  CheckAnyKey:
   294 00000187 B401                    		mov     ah, 1			; any key pressed?
   295 00000189 CD32                    		int     32h			; no, Loop.
   296 0000018B 7496                    		jz	short ScopeLoop
   297                                  
   298 0000018D B400                    		mov     ah, 0			; flush key buffer...
   299 0000018F CD32                    		int     32h
   300                                  
   301 00000191 66B80300                		mov     ax, 0003h		; Set Text Mode 80x25x16
   302 00000195 CD31                    		int     31h
   303                                  
   304                                  		;call	StopPlaying		; STOP!
   305                                  
   306                                  		;mov	byte [tLoop], 0
   307                                  _StopPlay:
   308                                  		; 11/03/2017
   309 00000197 30C0                    		xor     al, al
   310                                  		; Stop 8 bit (autoinitialized) DMA process	
   311                                  		;out	0Ch, al
   312                                  		;retn
   313 00000199 66BA0C00                		mov	dx, 0Ch
   314 0000019D B401                    		mov	ah, 1 ;outb
   315 0000019F CD34                    		int	34h
   316                                  
   317 000001A1 E88B030000              		call	SbDone
   318                                  
   319                                  		; Deallocate DMA buffer (not necessary just before exit!)
   320                                  		sys	_dalloc, DoubleBuffer, 2*DmaBufSize
   320                              <1> 
   320                              <1> 
   320                              <1> 
   320                              <1> 
   320                              <1>  %if %0 >= 2
   320 000001A6 BB[00000100]        <1>  mov ebx, %2
   320                              <1>  %if %0 >= 3
   320 000001AB B900000200          <1>  mov ecx, %3
   320                              <1>  %if %0 = 4
   320                              <1>  mov edx, %4
   320                              <1>  %endif
   320                              <1>  %endif
   320                              <1>  %endif
   320 000001B0 B82B000000          <1>  mov eax, %1
   320                              <1> 
   320 000001B5 CD40                <1>  int 40h
   321                                  		;jc	error_exit
   322                                  Exit:           
   323 000001B7 E80E050000              		call    FreeModule              ; Free MODule core.
   324                                  
   325                                  		sys	_exit			; Bye!
   325                              <1> 
   325                              <1> 
   325                              <1> 
   325                              <1> 
   325                              <1>  %if %0 >= 2
   325                              <1>  mov ebx, %2
   325                              <1>  %if %0 >= 3
   325                              <1>  mov ecx, %3
   325                              <1>  %if %0 = 4
   325                              <1>  mov edx, %4
   325                              <1>  %endif
   325                              <1>  %endif
   325                              <1>  %endif
   325 000001BC B801000000          <1>  mov eax, %1
   325                              <1> 
   325 000001C1 CD40                <1>  int 40h
   326                                  
   327                                  pmsg_usage:
   328                                  		sys	_msg, msg_usage, 255, 0Ah
   328                              <1> 
   328                              <1> 
   328                              <1> 
   328                              <1> 
   328                              <1>  %if %0 >= 2
   328 000001C3 BB[2E0E0000]        <1>  mov ebx, %2
   328                              <1>  %if %0 >= 3
   328 000001C8 B9FF000000          <1>  mov ecx, %3
   328                              <1>  %if %0 = 4
   328 000001CD BA0A000000          <1>  mov edx, %4
   328                              <1>  %endif
   328                              <1>  %endif
   328                              <1>  %endif
   328 000001D2 B823000000          <1>  mov eax, %1
   328                              <1> 
   328 000001D7 CD40                <1>  int 40h
   329 000001D9 EBDC                    		jmp	short Exit
   330                                  
   331                                  DetectSb:
   332 000001DB 60                      		pushad
   333                                  ScanPort:
   334 000001DC 66BB1002                		mov     bx, 210h		; start scanning ports
   335                                  						; 210h, 220h, .. 260h
   336                                  ResetDSP:       
   337 000001E0 6689DA                  		mov     dx, bx			; try to reset the DSP.
   338 000001E3 6683C206                		add     dx, 06h
   339 000001E7 B001                    		mov	al, 1
   340                                  		;out	dx, al
   341 000001E9 B401                    		mov	ah, 1 ; outb
   342 000001EB CD34                    		int	34h
   343                                  
   344                                  		;in	al, dx
   345                                  		;in	al, dx
   346                                  		;in	al, dx
   347                                  		;in	al, dx
   348                                  
   349 000001ED B400                    		mov	ah, 0 ; inb
   350 000001EF CD34                    		int	34h
   351                                  		;mov	ah, 0 ; inb
   352 000001F1 CD34                    		int	34h
   353                                  
   354 000001F3 30C0                    		xor     al, al
   355                                  		;out	dx, al
   356 000001F5 B401                    		mov	ah, 1 ; outb
   357 000001F7 CD34                    		int	34h
   358                                  
   359 000001F9 6683C208                		add     dx, 08h
   360                                  		;mov	cx, 100
   361 000001FD 66B92000                		mov	cx, 32
   362 00000201 28E4                    		sub	ah, ah ; 0
   363                                  WaitID:
   364                                  		;in	al, dx
   365 00000203 CD34                    		int	34h  ;ah = 0 ; inb
   366 00000205 08C0                    		or      al, al
   367 00000207 7804                    		js      short GetID
   368 00000209 E2F8                    		loop    WaitID
   369 0000020B EB10                    		jmp     short NextPort
   370                                  GetID:          
   371 0000020D 6683EA04                		sub     dx, 04h
   372                                  		;in	al, dx
   373 00000211 CD34                    		int	34h  ;ah = 0 ; inb
   374 00000213 3CAA                    		cmp     al, 0AAh
   375 00000215 7416                    		je      short Found
   376 00000217 6683C204                		add     dx, 04h
   377 0000021B E2E6                    		loop    WaitID
   378                                  NextPort:
   379 0000021D 6683C310                		add     bx, 10h			; if not response,
   380 00000221 6681FB6002              		cmp     bx, 260h		; try the next port.
   381 00000226 76B8                    		jbe     short ResetDSP
   382 00000228 E934010000              		jmp     Fail
   383                                  Found:
   384 0000022D 66891D[E00C0000]        		mov     [SbAddr], bx		; SB Port Address Found!
   385                                  ScanIRQ:
   386                                  SetIrqs:        ; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ
   387                                  		sys	_calbac, 102h, 2, SbIrq ; IRQ 2
   387                              <1> 
   387                              <1> 
   387                              <1> 
   387                              <1> 
   387                              <1>  %if %0 >= 2
   387 00000234 BB02010000          <1>  mov ebx, %2
   387                              <1>  %if %0 >= 3
   387 00000239 B902000000          <1>  mov ecx, %3
   387                              <1>  %if %0 = 4
   387 0000023E BA[E20C0000]        <1>  mov edx, %4
   387                              <1>  %endif
   387                              <1>  %endif
   387                              <1>  %endif
   387 00000243 B82C000000          <1>  mov eax, %1
   387                              <1> 
   387 00000248 CD40                <1>  int 40h
   388                                  						; Signal Response Byte
   389                                  		;jc	short error_exit
   390                                  
   391                                  		sys	_calbac, 103h, 3, SbIrq ; IRQ 3
   391                              <1> 
   391                              <1> 
   391                              <1> 
   391                              <1> 
   391                              <1>  %if %0 >= 2
   391 0000024A BB03010000          <1>  mov ebx, %2
   391                              <1>  %if %0 >= 3
   391 0000024F B903000000          <1>  mov ecx, %3
   391                              <1>  %if %0 = 4
   391 00000254 BA[E20C0000]        <1>  mov edx, %4
   391                              <1>  %endif
   391                              <1>  %endif
   391                              <1>  %endif
   391 00000259 B82C000000          <1>  mov eax, %1
   391                              <1> 
   391 0000025E CD40                <1>  int 40h
   392                                  						; Signal Response Byte 
   393                                  		;jc	short error_exit
   394                                  
   395                                  		sys	_calbac, 104h, 4, SbIrq ; IRQ 4
   395                              <1> 
   395                              <1> 
   395                              <1> 
   395                              <1> 
   395                              <1>  %if %0 >= 2
   395 00000260 BB04010000          <1>  mov ebx, %2
   395                              <1>  %if %0 >= 3
   395 00000265 B904000000          <1>  mov ecx, %3
   395                              <1>  %if %0 = 4
   395 0000026A BA[E20C0000]        <1>  mov edx, %4
   395                              <1>  %endif
   395                              <1>  %endif
   395                              <1>  %endif
   395 0000026F B82C000000          <1>  mov eax, %1
   395                              <1> 
   395 00000274 CD40                <1>  int 40h
   396                                  						; Signal Response Byte 
   397                                  		;jc	short error_exit
   398                                  
   399                                  		sys	_calbac, 105h, 5, SbIrq ; IRQ 5
   399                              <1> 
   399                              <1> 
   399                              <1> 
   399                              <1> 
   399                              <1>  %if %0 >= 2
   399 00000276 BB05010000          <1>  mov ebx, %2
   399                              <1>  %if %0 >= 3
   399 0000027B B905000000          <1>  mov ecx, %3
   399                              <1>  %if %0 = 4
   399 00000280 BA[E20C0000]        <1>  mov edx, %4
   399                              <1>  %endif
   399                              <1>  %endif
   399                              <1>  %endif
   399 00000285 B82C000000          <1>  mov eax, %1
   399                              <1> 
   399 0000028A CD40                <1>  int 40h
   400                                  						; Signal Response Byte 
   401                                  		;jc	short error_exit
   402                                  
   403                                  		sys	_calbac, 107h, 7, SbIrq ; IRQ 7
   403                              <1> 
   403                              <1> 
   403                              <1> 
   403                              <1> 
   403                              <1>  %if %0 >= 2
   403 0000028C BB07010000          <1>  mov ebx, %2
   403                              <1>  %if %0 >= 3
   403 00000291 B907000000          <1>  mov ecx, %3
   403                              <1>  %if %0 = 4
   403 00000296 BA[E20C0000]        <1>  mov edx, %4
   403                              <1>  %endif
   403                              <1>  %endif
   403                              <1>  %endif
   403 0000029B B82C000000          <1>  mov eax, %1
   403                              <1> 
   403 000002A0 CD40                <1>  int 40h
   404                                  						; Signal Response Byte 
   405                                  		;jc	short error_exit
   406                                  
   407 000002A2 C605[E20C0000]00        		mov     byte [SbIrq], 0		; clear the IRQ level.
   408                                  
   409 000002A9 668B15[E00C0000]        		mov     dx, [SbAddr]		; tells to the SB to
   410 000002B0 6683C20C                		add     dx, 0Ch			; generate a IRQ!
   411                                  WaitSb:         ;in	al, dx
   412 000002B4 B400                    		mov	ah, 0 ; inb
   413 000002B6 CD34                    		int	34h
   414 000002B8 08C0                    		or      al, al
   415 000002BA 78F8                    		js      short WaitSb
   416 000002BC B0F2                    		mov     al, 0F2h
   417                                  		;out	dx, al
   418 000002BE B401                    		mov	ah,1  ; outb
   419 000002C0 CD34                    		int	34h		
   420                                  
   421 000002C2 31C9                    		xor     ecx, ecx		; wait until IRQ level
   422                                  WaitIRQ:        
   423 000002C4 803D[E20C0000]00        		cmp     byte [SbIrq], 0		; is changed or timeout.
   424 000002CB 7506                    		jne     short IrqOk
   425 000002CD 6649                    		dec 	cx
   426 000002CF 75F3                    		jnz	short WaitIRQ
   427 000002D1 EB0F                    		jmp	short RestoreIrqs
   428                                  IrqOk:
   429 000002D3 668B15[E00C0000]        		mov     dx, [SbAddr]
   430 000002DA 6683C20E                		add     dx, 0Eh
   431                                  		;in	al, dx			; SB acknowledge.
   432 000002DE B400                    		mov	ah, 0 ; inb
   433 000002E0 CD34                    		int	34h
   434                                  		;mov	al, 20h
   435                                  		;;out	20h, al			; Hardware acknowledge.
   436                                  		;mov	ah,1  ; outb
   437                                  		;int	34h		
   438                                  
   439                                  RestoreIrqs:    ; UNLINK SIGNAL RESPONSE/RETURN BYTE FROM REQUESTED IRQ
   440                                  		sys	_calbac, 2		; unlink IRQ 2
   440                              <1> 
   440                              <1> 
   440                              <1> 
   440                              <1> 
   440                              <1>  %if %0 >= 2
   440 000002E2 BB02000000          <1>  mov ebx, %2
   440                              <1>  %if %0 >= 3
   440                              <1>  mov ecx, %3
   440                              <1>  %if %0 = 4
   440                              <1>  mov edx, %4
   440                              <1>  %endif
   440                              <1>  %endif
   440                              <1>  %endif
   440 000002E7 B82C000000          <1>  mov eax, %1
   440                              <1> 
   440 000002EC CD40                <1>  int 40h
   441                                  						; Signal Response Byte
   442                                  		sys	_calbac, 3		; unlink IRQ 3
   442                              <1> 
   442                              <1> 
   442                              <1> 
   442                              <1> 
   442                              <1>  %if %0 >= 2
   442 000002EE BB03000000          <1>  mov ebx, %2
   442                              <1>  %if %0 >= 3
   442                              <1>  mov ecx, %3
   442                              <1>  %if %0 = 4
   442                              <1>  mov edx, %4
   442                              <1>  %endif
   442                              <1>  %endif
   442                              <1>  %endif
   442 000002F3 B82C000000          <1>  mov eax, %1
   442                              <1> 
   442 000002F8 CD40                <1>  int 40h
   443                                  						; Signal Response Byte 
   444                                  		sys	_calbac, 4		; unlink IRQ 4
   444                              <1> 
   444                              <1> 
   444                              <1> 
   444                              <1> 
   444                              <1>  %if %0 >= 2
   444 000002FA BB04000000          <1>  mov ebx, %2
   444                              <1>  %if %0 >= 3
   444                              <1>  mov ecx, %3
   444                              <1>  %if %0 = 4
   444                              <1>  mov edx, %4
   444                              <1>  %endif
   444                              <1>  %endif
   444                              <1>  %endif
   444 000002FF B82C000000          <1>  mov eax, %1
   444                              <1> 
   444 00000304 CD40                <1>  int 40h
   445                                  						; Signal Response Byte 
   446                                  		sys	_calbac, 5		; unlink IRQ 5
   446                              <1> 
   446                              <1> 
   446                              <1> 
   446                              <1> 
   446                              <1>  %if %0 >= 2
   446 00000306 BB05000000          <1>  mov ebx, %2
   446                              <1>  %if %0 >= 3
   446                              <1>  mov ecx, %3
   446                              <1>  %if %0 = 4
   446                              <1>  mov edx, %4
   446                              <1>  %endif
   446                              <1>  %endif
   446                              <1>  %endif
   446 0000030B B82C000000          <1>  mov eax, %1
   446                              <1> 
   446 00000310 CD40                <1>  int 40h
   447                                  						; Signal Response Byte
   448                                  		sys	_calbac, 7		; unlink IRQ 7
   448                              <1> 
   448                              <1> 
   448                              <1> 
   448                              <1> 
   448                              <1>  %if %0 >= 2
   448 00000312 BB07000000          <1>  mov ebx, %2
   448                              <1>  %if %0 >= 3
   448                              <1>  mov ecx, %3
   448                              <1>  %if %0 = 4
   448                              <1>  mov edx, %4
   448                              <1>  %endif
   448                              <1>  %endif
   448                              <1>  %endif
   448 00000317 B82C000000          <1>  mov eax, %1
   448                              <1> 
   448 0000031C CD40                <1>  int 40h
   449                                  						; Signal Response Byte 
   450                                  
   451 0000031E 803D[E20C0000]00        		cmp     byte [SbIrq], 0		; IRQ level was changed?
   452 00000325 743A                    		je      short Fail		; no, fail.
   453                                  Success:        
   454 00000327 668B15[E00C0000]        		mov     dx, [SbAddr]		; Print Sucessful message.
   455 0000032E 8A0D[E20C0000]          		mov     cl, [SbIrq]
   456 00000334 C0EA04                  		shr     dl, 4
   457 00000337 80C230                  		add     dl, '0'
   458 0000033A 8815[2E0F0000]          		mov     [PortText], dl
   459 00000340 80C130                  		add     cl, '0'
   460 00000343 880D[370F0000]          		mov     [IrqText], cl
   461                                  
   462                                  		sys	_msg, MsgFound, 255, 0Fh
   462                              <1> 
   462                              <1> 
   462                              <1> 
   462                              <1> 
   462                              <1>  %if %0 >= 2
   462 00000349 BB[0E0F0000]        <1>  mov ebx, %2
   462                              <1>  %if %0 >= 3
   462 0000034E B9FF000000          <1>  mov ecx, %3
   462                              <1>  %if %0 = 4
   462 00000353 BA0F000000          <1>  mov edx, %4
   462                              <1>  %endif
   462                              <1>  %endif
   462                              <1>  %endif
   462 00000358 B823000000          <1>  mov eax, %1
   462                              <1> 
   462 0000035D CD40                <1>  int 40h
   463                                  
   464 0000035F 61                      		popad				; Return to caller.
   465 00000360 C3                      		retn
   466                                  
   467                                  Fail:  
   468                                  		; Print Failed Message,
   469                                  		; and exit to MainProg.
   470                                  
   471                                  		sys	_msg, MsgNotFound, 255, 0Fh
   471                              <1> 
   471                              <1> 
   471                              <1> 
   471                              <1> 
   471                              <1>  %if %0 >= 2
   471 00000361 BB[E60E0000]        <1>  mov ebx, %2
   471                              <1>  %if %0 >= 3
   471 00000366 B9FF000000          <1>  mov ecx, %3
   471                              <1>  %if %0 = 4
   471 0000036B BA0F000000          <1>  mov edx, %4
   471                              <1>  %endif
   471                              <1>  %endif
   471                              <1>  %endif
   471 00000370 B823000000          <1>  mov eax, %1
   471                              <1> 
   471 00000375 CD40                <1>  int 40h
   472                                  
   473                                  		sys 	_exit
   473                              <1> 
   473                              <1> 
   473                              <1> 
   473                              <1> 
   473                              <1>  %if %0 >= 2
   473                              <1>  mov ebx, %2
   473                              <1>  %if %0 >= 3
   473                              <1>  mov ecx, %3
   473                              <1>  %if %0 = 4
   473                              <1>  mov edx, %4
   473                              <1>  %endif
   473                              <1>  %endif
   473                              <1>  %endif
   473 00000377 B801000000          <1>  mov eax, %1
   473                              <1> 
   473 0000037C CD40                <1>  int 40h
   474                                  here:
   475 0000037E EBFE                    		jmp	short here
   476                                  
   477                                  ;=============================================================================
   478                                  ;               SB.ASM
   479                                  ;=============================================================================
   480                                  
   481                                  ;  Sound Blaster DMA Driver v0.1b by Carlos Hasan.
   482                                  ;		July 24th, 1993.
   483                                  
   484                                  ; EQUATES
   485                                  
   486                                  DmaBufSize 	equ	65536 ; 12/03/2017
   487                                  
   488                                  ; MACROS
   489                                  
   490                                  %macro	SbOut	1
   491                                  %%Wait:
   492                                  	;in	al, dx
   493                                  	mov	ah, 0
   494                                  	int	34h
   495                                  	or	al, al
   496                                  	js	short %%Wait
   497                                  	mov	al, %1
   498                                  	;out	dx, al
   499                                  	mov	ah, 1
   500                                  	int	34h
   501                                  %endmacro
   502                                  
   503                                  ; CODE
   504                                  
   505                                  ;--------------------------------------------------------------------------
   506                                  ; SbIrqHandler:  Sound Blaster IRQ handler.
   507                                  ;--------------------------------------------------------------------------
   508                                  
   509                                  SbIrqHandler:	; SoundBlaster IRQ Callback service for TRDOS 386
   510                                  		; 03/03/2017
   511                                  
   512                                  		; 12/03/2017
   513                                  		; 11/03/2017
   514                                  
   515 00000380 668B15[E00C0000]        		mov     dx, [SbAddr]
   516 00000387 6683C20E                		add     dx, 0Eh
   517                                  		;in	al, dx
   518                                  		;mov	ah, 0
   519 0000038B 28E4                    		sub	ah, ah
   520 0000038D CD34                    		int	34h
   521                                  
   522                                  		;test	byte [flags], ENDOFFILE	; end of file flag
   523                                  		;jz	short a_3
   524                                  
   525                                  		;sub     dx, 02h ; 0Ch
   526                                  
   527                                  		; exit auto-initialize 8 bit transfer
   528                                  		;SbOut	0DAh ; exit auto-initialize transfer command
   529                                  		;jmp	short a_5
   530                                  
   531                                  a_3:
   532 0000038F 30C0                    		xor	al, al ; 0
   533 00000391 A2[5D0F0000]            		mov	[iStatus], al
   534 00000396 3805[5C0F0000]          		cmp 	[DmaFlag], al
   535 0000039C 7702                    		ja	short a_4
   536 0000039E FEC0                    		inc	al
   537                                  a_4:
   538 000003A0 A2[5C0F0000]            		mov 	[DmaFlag], al ; 
   539                                  a_5:
   540                                  		sys	_rele ; return from callback service
   540                              <1> 
   540                              <1> 
   540                              <1> 
   540                              <1> 
   540                              <1>  %if %0 >= 2
   540                              <1>  mov ebx, %2
   540                              <1>  %if %0 >= 3
   540                              <1>  mov ecx, %3
   540                              <1>  %if %0 = 4
   540                              <1>  mov edx, %4
   540                              <1>  %endif
   540                              <1>  %endif
   540                              <1>  %endif
   540 000003A5 B827000000          <1>  mov eax, %1
   540                              <1> 
   540 000003AA CD40                <1>  int 40h
   541                                  
   542                                  ;--------------------------------------------------------------------------
   543                                  ; SbPoll:  Sound Blaster Polling.
   544                                  ;--------------------------------------------------------------------------
   545                                  
   546                                  SbPoll:
   547 000003AC 60                      		pushad
   548                                  		
   549                                  		; 11/03/2017
   550 000003AD 803D[5D0F0000]00        		cmp	byte [iStatus], 0
   551 000003B4 7721                    		ja	short Bye
   552                                  	
   553 000003B6 C605[5D0F0000]01        		mov	byte [iStatus], 1 ; 1 = set before interrupt
   554                                  			     ; (for preventing data load
   555                                  			     ; without an interrupt)	
   556                                  
   557                                  		;test	byte [flags], ENDOFFILE
   558                                  		;jnz	short sbPoll_stop
   559                                  
   560 000003BD BF[00000100]            		mov     edi, DmaBuffer
   561 000003C2 BB00800000              		mov     ebx, DmaBufSize/2
   562                                  
   563 000003C7 F605[5C0F0000]01        		test	byte [DmaFlag], 1
   564 000003CE 7402                    		jz	short FirstHalf
   565                                  SecondHalf:
   566 000003D0 01DF                    		add     edi, ebx
   567                                  FirstHalf:
   568 000003D2 E8E9070000              		call    GetSamples
   569                                  Bye:
   570 000003D7 61                      		popad
   571 000003D8 C3                      		retn
   572                                  
   573                                  ;sbPoll_stop:	; 11/03/2017
   574                                  ;		; exit auto-initialize 8 bit transfer
   575                                  ;		SbOut	0DAh ; exit auto-initialize transfer command
   576                                  ;		;mov	byte [tLoop}, 0
   577                                  ;		jmp	short Bye
   578                                  
   579                                  ;--------------------------------------------------------------------------
   580                                  ; SbInit: Initializes the Sound Blaster Driver.
   581                                  ;--------------------------------------------------------------------------
   582                                  
   583                                  SbInit:
   584 000003D9 60                      		pushad
   585                                  
   586 000003DA E85C080000              		call    StartPlaying
   587                                  SetBuffer:
   588                                  		;mov	byte [DmaFlag], 0
   589 000003DF 8B1D[90860000]          		mov	ebx, [DMA_phy_buff] ; physical addr of DMA buff
   590 000003E5 B900000100              		mov     ecx, DmaBufSize
   591 000003EA 49                      		dec     ecx
   592                                  
   593                                  		; 8 bit DMA buffer setting (DMA channel 1)
   594 000003EB B005                    		mov     al, 05h ; set mask bit for channel 1  (4+1)
   595                                  		;out	0Ah, al
   596 000003ED 66BA0A00                		mov	dx, 0Ah ; DMA mask register
   597 000003F1 B401                    		mov	ah, 1  ;outb
   598 000003F3 CD34                    		int	34h
   599                                  
   600 000003F5 30C0                    		xor     al, al ; stops all DMA processes on selected channel
   601                                  		;out	0Ch, al
   602 000003F7 B20C                    		mov	dl, 0Ch  ; clear selected channel register
   603                                  		;mov	ah, 1  ;outb
   604 000003F9 CD34                    		int	34h
   605                                  
   606 000003FB 88D8                    		mov     al, bl	; byte 0 of DMA buffer address (physical)   
   607                                  		;out	02h, al
   608 000003FD B202                    		mov	dl, 02h	; DMA channel 1 port number
   609                                  		;mov	ah, 1  ;outb
   610 000003FF CD34                    		int	34h
   611                                  
   612 00000401 88F8                    		mov     al, bh  ; byte 1 of DMA buffer address (physical)   
   613                                  		;out	02h, al
   614                                  		;mov	dl, 02h ; DMA channel 1 port number
   615                                  		;mov	ah, 1  ;outb
   616 00000403 CD34                    		int	34h
   617                                  
   618 00000405 C1EB10                  		shr	ebx, 16
   619                                  
   620 00000408 88D8                    		mov     al, bl ; byte 2 of DMA buffer address (physical)   
   621                                  		;out	83h, al
   622 0000040A B283                    		mov	dl, 83h ; page register port addr for channel 1
   623                                  		;mov	ah, 1  ;outb
   624 0000040C CD34                    		int	34h
   625                                  
   626 0000040E 88C8                    		mov     al, cl ; low byte of DMA count - 1
   627                                  		;out	03h, al
   628 00000410 B203                    		mov	dl, 03h ; count register port addr for channel 1
   629                                  		;mov	ah, 1  ;outb
   630 00000412 CD34                    		int	34h
   631                                  
   632 00000414 88E8                    		mov     al, ch ; high byte of DMA count - 1
   633                                  		;out	03h, al
   634                                  		;mov	dl, 03h ; count register port addr for channel 1
   635                                  		;mov	ah, 1  ;outb
   636 00000416 CD34                    		int	34h
   637                                  
   638                                  		; channel 1, read, autoinitialized, single mode
   639 00000418 B059                    		mov     al, 59h ; 07/09/2017
   640                                  		;out	0Bh, al
   641 0000041A B20B                    		mov	dl, 0Bh ; DMA mode register port address
   642                                  		;mov	ah, 1  ;outb
   643 0000041C CD34                    		int	34h
   644                                  
   645 0000041E B001                    		mov     al, 01h ; clear mask bit for channel 1
   646                                  		;out	0Ah, al
   647 00000420 B20A                    		mov	dl, 0Ah ; DMA mask register port address
   648                                  		;mov	ah, 1  ;outb
   649 00000422 CD34                    		int	34h
   650                                  ClearBuffer:
   651 00000424 BF[00000100]            		mov     edi, DmaBuffer	; virtual addr of DMA buff
   652                                  		;mov	ecx, DmaBufSize
   653 00000429 41                      		inc	ecx
   654 0000042A B080                    		mov     al, 80h
   655                                  		;cld
   656 0000042C F3AA                    		rep     stosb
   657                                  SetIrq:
   658                                  		; CALLBACK method
   659 0000042E 8A1D[E20C0000]          		mov	bl, [SbIrq] ; IRQ number
   660 00000434 B702                    		mov	bh, 2 ; Link IRQ to user for callback service
   661 00000436 BA[80030000]            		mov	edx, SbIrqHandler
   662                                  		sys	_calbac 
   662                              <1> 
   662                              <1> 
   662                              <1> 
   662                              <1> 
   662                              <1>  %if %0 >= 2
   662                              <1>  mov ebx, %2
   662                              <1>  %if %0 >= 3
   662                              <1>  mov ecx, %3
   662                              <1>  %if %0 = 4
   662                              <1>  mov edx, %4
   662                              <1>  %endif
   662                              <1>  %endif
   662                              <1>  %endif
   662 0000043B B82C000000          <1>  mov eax, %1
   662                              <1> 
   662 00000440 CD40                <1>  int 40h
   663                                  		; SIGNAL RESPONSE BYTE method ; 04/03/2017
   664                                  		;mov	bl, [SbIrq]
   665                                  		;mov	bh, 1 ; Signal Response Byte method
   666                                  		;movzx	ecx, bl ; S.R.B. value = IRQ Number 
   667                                  		;mov	edx, SbSrb ; S.R.B. address
   668                                  		;sys	_calbac
   669                                  ResetDsp:
   670 00000442 668B15[E00C0000]        		mov     dx, [SbAddr]
   671 00000449 6683C206                		add     dx, 06h
   672 0000044D B001                    		mov     al, 1
   673                                  		;out	dx, al
   674 0000044F B401                    		mov	ah, 1  ;outb
   675 00000451 CD34                    		int	34h
   676                                  
   677                                  		;in	al, dx
   678                                  		;in	al, dx
   679                                  		;in	al, dx
   680                                  		;in	al, dx
   681                                  
   682 00000453 FECC                    		dec	ah ; ah = 0 ; inb
   683 00000455 CD34                    		int	34h		
   684                                  		;mov	ah, 0
   685 00000457 CD34                    		int	34h
   686                                  
   687 00000459 30C0                    		xor     al, al
   688                                  		;out	dx, al
   689 0000045B FEC4                    		inc	ah ; ah = 1 ;outb
   690 0000045D CD34                    		int	34h
   691                                  
   692 0000045F 66B96400                		mov     cx, 100
   693 00000463 28E4                    		sub	ah, ah ; 0
   694                                  WaitId:         
   695 00000465 668B15[E00C0000]        		mov     dx, [SbAddr]
   696 0000046C 6683C20E                		add     dx, 0Eh
   697                                  		;in	al, dx
   698                                  		;mov	ah, 0  ;inb
   699 00000470 CD34                    		int	34h
   700 00000472 08C0                    		or      al, al
   701 00000474 7807                    		js      short sb_GetId
   702 00000476 E2ED                    		loop    WaitId
   703 00000478 E9B2000000              		jmp     sb_Exit
   704                                  sb_GetId:          
   705 0000047D 668B15[E00C0000]        		mov     dx, [SbAddr]
   706 00000484 6683C20A                		add     dx, 0Ah
   707                                  		;in	al, dx
   708                                  		;mov	ah, 0  ;inb
   709 00000488 CD34                    		int	34h
   710 0000048A 3CAA                    		cmp     al, 0AAh
   711 0000048C 7407                    		je      short SbOk
   712 0000048E E2D5                    		loop    WaitId
   713 00000490 E99A000000              		jmp	sb_Exit
   714                                  SbOk:
   715 00000495 668B15[E00C0000]        		mov     dx, [SbAddr]
   716 0000049C 6683C20C                		add     dx, 0Ch
   717                                  		SbOut   0D1h
   717                              <1> %%Wait:
   717                              <1> 
   717 000004A0 B400                <1>  mov ah, 0
   717 000004A2 CD34                <1>  int 34h
   717 000004A4 08C0                <1>  or al, al
   717 000004A6 78F8                <1>  js short %%Wait
   717 000004A8 B0D1                <1>  mov al, %1
   717                              <1> 
   717 000004AA B401                <1>  mov ah, 1
   717 000004AC CD34                <1>  int 34h
   718                                  		
   719                                  		; 11/03/2017
   720                                  		SbOut   41h ; 8 bit or 16 bit transfer
   720                              <1> %%Wait:
   720                              <1> 
   720 000004AE B400                <1>  mov ah, 0
   720 000004B0 CD34                <1>  int 34h
   720 000004B2 08C0                <1>  or al, al
   720 000004B4 78F8                <1>  js short %%Wait
   720 000004B6 B041                <1>  mov al, %1
   720                              <1> 
   720 000004B8 B401                <1>  mov ah, 1
   720 000004BA CD34                <1>  int 34h
   721 000004BC 668B1D[9E130000]        		mov	bx, [sampling_rate]
   722                                  		SbOut	bh ; sampling rate high byte
   722                              <1> %%Wait:
   722                              <1> 
   722 000004C3 B400                <1>  mov ah, 0
   722 000004C5 CD34                <1>  int 34h
   722 000004C7 08C0                <1>  or al, al
   722 000004C9 78F8                <1>  js short %%Wait
   722 000004CB 88F8                <1>  mov al, %1
   722                              <1> 
   722 000004CD B401                <1>  mov ah, 1
   722 000004CF CD34                <1>  int 34h
   723                                  		SbOut	bl ; sampling rate low byte
   723                              <1> %%Wait:
   723                              <1> 
   723 000004D1 B400                <1>  mov ah, 0
   723 000004D3 CD34                <1>  int 34h
   723 000004D5 08C0                <1>  or al, al
   723 000004D7 78F8                <1>  js short %%Wait
   723 000004D9 88D8                <1>  mov al, %1
   723                              <1> 
   723 000004DB B401                <1>  mov ah, 1
   723 000004DD CD34                <1>  int 34h
   724                                  		
   725                                  		; 22/04/2017
   726                                  		;mov	ah, 1
   727                                  		;mov	dx, [SbAddr]
   728                                  		;add	dx, 4 ; Mixer chip address port
   729 000004DF 6683EA08                		sub	dx, 0Ch-04h
   730 000004E3 B022                    		mov	al, 22h ; master volume
   731 000004E5 CD34                    		int	34h
   732 000004E7 6642                    		inc	dx
   733 000004E9 B0FF                    		mov	al, 0FFh ; maximum volume level
   734 000004EB CD34                    		int	34h
   735 000004ED 6683C207                		add	dx, 0Ch-05h
   736                                  StartDma:  
   737                                  		; autoinitialized 8 bit DMA transfer mode
   738                                  		;mov	bx, 0C6h ; 8 bit output (0C6h)
   739                                  		; PCM output (8 bit mono autoinitialized transfer)
   740                                  		;SbOut  bl ; bCommand
   741                                  		;SbOut	bh ; bMode
   742                                  		SbOut	0C6h ; bCommand (C6h = 8 bit autoinitialzed)
   742                              <1> %%Wait:
   742                              <1> 
   742 000004F1 B400                <1>  mov ah, 0
   742 000004F3 CD34                <1>  int 34h
   742 000004F5 08C0                <1>  or al, al
   742 000004F7 78F8                <1>  js short %%Wait
   742 000004F9 B0C6                <1>  mov al, %1
   742                              <1> 
   742 000004FB B401                <1>  mov ah, 1
   742 000004FD CD34                <1>  int 34h
   743                                  		SbOut	0    ; bMode (0 = 8 bit mono)	
   743                              <1> %%Wait:
   743                              <1> 
   743 000004FF B400                <1>  mov ah, 0
   743 00000501 CD34                <1>  int 34h
   743 00000503 08C0                <1>  or al, al
   743 00000505 78F8                <1>  js short %%Wait
   743 00000507 B000                <1>  mov al, %1
   743                              <1> 
   743 00000509 B401                <1>  mov ah, 1
   743 0000050B CD34                <1>  int 34h
   744 0000050D 66BB0080                		mov	bx, DmaBufSize / 2
   745 00000511 664B                    		dec	bx  ; wBlkSize is one less than the actual size 
   746                                  		SbOut   bl
   746                              <1> %%Wait:
   746                              <1> 
   746 00000513 B400                <1>  mov ah, 0
   746 00000515 CD34                <1>  int 34h
   746 00000517 08C0                <1>  or al, al
   746 00000519 78F8                <1>  js short %%Wait
   746 0000051B 88D8                <1>  mov al, %1
   746                              <1> 
   746 0000051D B401                <1>  mov ah, 1
   746 0000051F CD34                <1>  int 34h
   747                                  		SbOut   bh
   747                              <1> %%Wait:
   747                              <1> 
   747 00000521 B400                <1>  mov ah, 0
   747 00000523 CD34                <1>  int 34h
   747 00000525 08C0                <1>  or al, al
   747 00000527 78F8                <1>  js short %%Wait
   747 00000529 88F8                <1>  mov al, %1
   747                              <1> 
   747 0000052B B401                <1>  mov ah, 1
   747 0000052D CD34                <1>  int 34h
   748                                  sb_Exit:           
   749 0000052F 61                      		popad
   750 00000530 C3                      		retn
   751                                  
   752                                  ;--------------------------------------------------------------------------
   753                                  ; SbDone:  Shut Down the Sound Blaster Driver.
   754                                  ;--------------------------------------------------------------------------
   755                                  
   756                                  SbDone:
   757 00000531 60                      		pushad
   758                                  
   759 00000532 8A1D[E20C0000]          		mov     bl, [SbIrq] ; IRQ number
   760 00000538 28FF                    		sub	bh, bh ; 0 = Unlink IRQ from user
   761                                  		sys	_calbac 
   761                              <1> 
   761                              <1> 
   761                              <1> 
   761                              <1> 
   761                              <1>  %if %0 >= 2
   761                              <1>  mov ebx, %2
   761                              <1>  %if %0 >= 3
   761                              <1>  mov ecx, %3
   761                              <1>  %if %0 = 4
   761                              <1>  mov edx, %4
   761                              <1>  %endif
   761                              <1>  %endif
   761                              <1>  %endif
   761 0000053A B82C000000          <1>  mov eax, %1
   761                              <1> 
   761 0000053F CD40                <1>  int 40h
   762                                  
   763 00000541 668B15[E00C0000]        		mov     dx, [SbAddr]
   764 00000548 6683C20C                		add     dx, 0Ch
   765                                  		SbOut   0D0h
   765                              <1> %%Wait:
   765                              <1> 
   765 0000054C B400                <1>  mov ah, 0
   765 0000054E CD34                <1>  int 34h
   765 00000550 08C0                <1>  or al, al
   765 00000552 78F8                <1>  js short %%Wait
   765 00000554 B0D0                <1>  mov al, %1
   765                              <1> 
   765 00000556 B401                <1>  mov ah, 1
   765 00000558 CD34                <1>  int 34h
   766                                  		SbOut   0D3h
   766                              <1> %%Wait:
   766                              <1> 
   766 0000055A B400                <1>  mov ah, 0
   766 0000055C CD34                <1>  int 34h
   766 0000055E 08C0                <1>  or al, al
   766 00000560 78F8                <1>  js short %%Wait
   766 00000562 B0D3                <1>  mov al, %1
   766                              <1> 
   766 00000564 B401                <1>  mov ah, 1
   766 00000566 CD34                <1>  int 34h
   767                                  
   768 00000568 E872070000              		call    StopPlaying
   769                                  
   770 0000056D 61                      		popad
   771 0000056E C3                      		retn
   772                                  
   773                                  ;=============================================================================
   774                                  ;               MODLOAD.ASM
   775                                  ;=============================================================================
   776                                  
   777                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   778                                  ;		July 10th, 1993.
   779                                  
   780                                  ; STRUCTURES
   781                                  
   782                                  struc ModSample
   783 00000000 <res 00000016>          .msName:	resb 22
   784 00000016 <res 00000002>          .msLength:	resw 1
   785 00000018 <res 00000001>          .msFinetune:	resb 1
   786 00000019 <res 00000001>          .msVolume:	resb 1
   787 0000001A <res 00000002>          .msRepeat:	resw 1
   788 0000001C <res 00000002>          .msRepLen:	resw 1
   789                                  .size:
   790                                  endstruc
   791                                  
   792                                  struc ModHeader
   793 00000000 <res 00000014>          .mhName:	resb 20
   794 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   795 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   796 000003B7 <res 00000001>          .mhReStart:	resb 1
   797 000003B8 <res 00000080>          .mhOrder:	resb 128
   798 00000438 <res 00000004>          .mhSign:	resw 2
   799                                  .size:	
   800                                  endstruc
   801                                  
   802                                  struc ModInfoRec
   803 00000000 <res 00000001>          .OrderLen:	resb 1
   804 00000001 <res 00000001>          .ReStart:	resb 1
   805 00000002 <res 00000080>          .Order:		resb 128
   806 00000082 <res 00000004>          .Patterns:	resd 1
   807 00000086 <res 0000003E>          .SampOfs:	resw 31
   808 000000C4 <res 0000003E>          .SampSeg:	resw 31
   809 00000102 <res 0000003E>          .SampLen:	resw 31
   810 00000140 <res 0000003E>          .SampRep:	resw 31
   811 0000017E <res 0000003E>          .SampRepLen:	resw 31
   812 000001BC <res 0000003E>          .SampVol:	resw 31
   813                                  .size:	
   814                                  endstruc
   815                                  
   816                                  ; CODE
   817                                  
   818                                  LoadModule:
   819                                  		; edi = file name address
   820                                  
   821 0000056F 60                      		pushad
   822                                  		
   823                                  		;call    ClearModInfo ; 07/10/2017 (not necessary.)
   824                                  OpenFile:       
   825                                  		; ebx = ASCIIZ file name address
   826                                  		; ecx = open mode (0 = open for read)		
   827                                  		sys	_open, edi, 0 ; open for reading
   827                              <1> 
   827                              <1> 
   827                              <1> 
   827                              <1> 
   827                              <1>  %if %0 >= 2
   827 00000570 89FB                <1>  mov ebx, %2
   827                              <1>  %if %0 >= 3
   827 00000572 B900000000          <1>  mov ecx, %3
   827                              <1>  %if %0 = 4
   827                              <1>  mov edx, %4
   827                              <1>  %endif
   827                              <1>  %endif
   827                              <1>  %endif
   827 00000577 B805000000          <1>  mov eax, %1
   827                              <1> 
   827 0000057C CD40                <1>  int 40h
   828 0000057E 0F8244010000            		jc	Failed
   829 00000584 A3[5E0F0000]            		mov     [FileHandle], eax
   830                                  ReadHeader:
   831                                  		; ebx = File handle
   832                                  		; ecx = Buffer address
   833                                  		; edx = Byte count
   834                                  		sys	_read, [FileHandle], Header, ModHeader.size
   834                              <1> 
   834                              <1> 
   834                              <1> 
   834                              <1> 
   834                              <1>  %if %0 >= 2
   834 00000589 8B1D[5E0F0000]      <1>  mov ebx, %2
   834                              <1>  %if %0 >= 3
   834 0000058F B9[620F0000]        <1>  mov ecx, %3
   834                              <1>  %if %0 = 4
   834 00000594 BA3C040000          <1>  mov edx, %4
   834                              <1>  %endif
   834                              <1>  %endif
   834                              <1>  %endif
   834 00000599 B803000000          <1>  mov eax, %1
   834                              <1> 
   834 0000059E CD40                <1>  int 40h
   835 000005A0 0F8213010000            		jc      CloseFile
   836                                  CheckMK:        
   837 000005A6 813D[9A130000]4D2E-     		cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   837 000005AE 4B2E               
   838 000005B0 7412                    		je      short IsModFile
   839                                  CheckFLT4:
   840 000005B2 813D[9A130000]464C-     		cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   840 000005BA 5434               
   841 000005BC 7406                    		je      short IsModFile
   842                                  		; 07/10/2017
   843 000005BE F9                      		stc
   844 000005BF E9F5000000              		jmp	CloseFile
   845                                  IsModFile:
   846 000005C4 A0[18130000]            		mov     al, [Header+ModHeader.mhOrderLen]
   847 000005C9 A2[A0130000]            		mov     [ModInfo.OrderLen], al
   848                                  
   849 000005CE A0[19130000]            		mov     al, [Header+ModHeader.mhReStart]
   850 000005D3 3A05[18130000]          		cmp     al, [Header+ModHeader.mhOrderLen]
   851 000005D9 7202                    		jb      short SetReStart
   852 000005DB B07F                    		mov     al, 7Fh
   853                                  SetReStart:
   854 000005DD A2[A1130000]            		mov     [ModInfo.ReStart], al
   855                                  
   856                                  		;mov	ecx, 128
   857 000005E2 66B98000                		mov	cx, 128
   858 000005E6 31D2                    		xor     edx, edx
   859 000005E8 31DB                    		xor     ebx, ebx
   860                                  CopyOrder:
   861 000005EA 8AB3[1A130000]          		mov     dh, [Header+ModHeader.mhOrder+ebx]
   862 000005F0 88B3[A2130000]          		mov     [ModInfo.Order+ebx], dh
   863 000005F6 38D6                    		cmp     dh, dl
   864 000005F8 7202                    		jb      short NextOrder
   865 000005FA 88F2                    		mov     dl, dh
   866                                  NextOrder:
   867 000005FC 43                      		inc     ebx
   868 000005FD E2EB                    		loop    CopyOrder
   869                                  AllocPatterns:  
   870 000005FF 81E2FF000000            		and	edx, 0FFh
   871                                  		;inc	dx
   872 00000605 FEC2                    		inc	dl  ; 07/10/2017
   873                                  		; dl = count of 1024 bytes ; count of patterns (04/07/2017)
   874 00000607 C1E20A                  		shl	edx, 10 ; *1024 ; (count of patterns *64*16)
   875                                  
   876 0000060A 89D5                    		mov	ebp, edx ; offset of samples (04/07/2017)
   877                                  		;mov	ecx, 10000h ; next 64K (4096*16)
   878 0000060C B9[00000200]            		mov	ecx, file_buffer ; 12/03/2017
   879                                  		;
   880 00000611 890D[22140000]          		mov	[ModInfo.Patterns], ecx
   881                                  		;
   882 00000617 01CD                    		add	ebp, ecx ; next offset for samples
   883                                  ReadPatterns:  
   884                                  		;mov	ebx, [FileHandle] 
   885                                  		; ebx = File handle
   886                                  		; ecx = Buffer address
   887                                  		; edx = Byte count
   888                                  		sys	_read, [FileHandle]
   888                              <1> 
   888                              <1> 
   888                              <1> 
   888                              <1> 
   888                              <1>  %if %0 >= 2
   888 00000619 8B1D[5E0F0000]      <1>  mov ebx, %2
   888                              <1>  %if %0 >= 3
   888                              <1>  mov ecx, %3
   888                              <1>  %if %0 = 4
   888                              <1>  mov edx, %4
   888                              <1>  %endif
   888                              <1>  %endif
   888                              <1>  %endif
   888 0000061F B803000000          <1>  mov eax, %1
   888                              <1> 
   888 00000624 CD40                <1>  int 40h
   889 00000626 0F828D000000            		jc      CloseFile
   890                                  
   891                                  		; paterns have been loaded here... (04/07/2017)
   892                                  
   893 0000062C BE[760F0000]            		mov	esi, Header+ModHeader.mhSamples
   894 00000631 31FF                    		xor     edi, edi
   895                                  CopySamples:
   896 00000633 668B4616                		mov     ax, [esi+ModSample.msLength]
   897 00000637 86C4                    		xchg    al, ah
   898 00000639 66D1E0                  		shl     ax, 1
   899 0000063C 668987[A2140000]        		mov     [ModInfo.SampLen+edi], ax
   900 00000643 8A4619                  		mov     al, [esi+ModSample.msVolume]
   901 00000646 30E4                    		xor     ah, ah
   902 00000648 668987[5C150000]        		mov     [ModInfo.SampVol+edi], ax
   903 0000064F 668B461A                		mov     ax, [esi+ModSample.msRepeat]
   904 00000653 86C4                    		xchg    al, ah
   905 00000655 66D1E0                  		shl     ax, 1
   906 00000658 668987[E0140000]        		mov     [ModInfo.SampRep+edi], ax
   907 0000065F 668B461C                		mov     ax, [esi+ModSample.msRepLen]
   908 00000663 86C4                    		xchg    al, ah
   909 00000665 66D1E0                  		shl     ax, 1
   910 00000668 668987[1E150000]        		mov     [ModInfo.SampRepLen+edi], ax
   911 0000066F 83C61E                  		add     esi, ModSample.size
   912 00000672 6683C702                		add     di, 2
   913 00000676 6683FF3E                		cmp     di, 2*31
   914 0000067A 72B7                    		jb      short CopySamples
   915                                  
   916 0000067C 31F6                    		xor     esi, esi
   917                                  AllocSamples:
   918 0000067E 0FB796[A2140000]        		movzx	edx, word [ModInfo.SampLen+esi]
   919                                  		; 07/10/2017
   920                                  		;shr	dx, 4 ; ***
   921 00000685 21D2                    		and	edx, edx
   922 00000687 7426                    		jz      short NextSample
   923                                  		;inc	dx  ; number of paragraphs ; ***
   924                                  		;shl	dx, 4 ; ***
   925 00000689 89E8                    		mov	eax, ebp
   926 0000068B 668986[26140000]        		mov	[ModInfo.SampOfs+esi], ax
   927 00000692 C1E810                  		shr	eax, 16
   928 00000695 668986[64140000]        		mov	[ModInfo.SampSeg+esi], ax
   929 0000069C 89E9                    		mov	ecx, ebp
   930 0000069E 01D5                    		add	ebp, edx ; next offset for sample 
   931                                  ReadSample:
   932                                  		;mov	ebx, [FileHandle]
   933                                  		;movzx  edx, [ModInfo.SampLen+esi]
   934                                  		;mov    ecx, [ModInfo.SampOfs+esi]
   935                                  
   936                                  		; ebx = File handle
   937                                  		; ecx = Buffer address
   938                                  		; edx = Byte count
   939                                  		sys	_read, [FileHandle]
   939                              <1> 
   939                              <1> 
   939                              <1> 
   939                              <1> 
   939                              <1>  %if %0 >= 2
   939 000006A0 8B1D[5E0F0000]      <1>  mov ebx, %2
   939                              <1>  %if %0 >= 3
   939                              <1>  mov ecx, %3
   939                              <1>  %if %0 = 4
   939                              <1>  mov edx, %4
   939                              <1>  %endif
   939                              <1>  %endif
   939                              <1>  %endif
   939 000006A6 B803000000          <1>  mov eax, %1
   939                              <1> 
   939 000006AB CD40                <1>  int 40h
   940 000006AD 720A                    		jc      short CloseFile
   941                                  
   942                                  NextSample:
   943 000006AF 6683C602                		add     si, 2
   944 000006B3 6683FE3E                		cmp     si, 2*31
   945 000006B7 72C5                    		jb      short AllocSamples
   946                                  CloseFile:      
   947 000006B9 9C                      		pushf
   948                                  		sys	_close, [FileHandle]
   948                              <1> 
   948                              <1> 
   948                              <1> 
   948                              <1> 
   948                              <1>  %if %0 >= 2
   948 000006BA 8B1D[5E0F0000]      <1>  mov ebx, %2
   948                              <1>  %if %0 >= 3
   948                              <1>  mov ecx, %3
   948                              <1>  %if %0 = 4
   948                              <1>  mov edx, %4
   948                              <1>  %endif
   948                              <1>  %endif
   948                              <1>  %endif
   948 000006C0 B806000000          <1>  mov eax, %1
   948                              <1> 
   948 000006C5 CD40                <1>  int 40h
   949 000006C7 9D                      		popf
   950                                  Failed:         
   951 000006C8 61                      		popad
   952                                  
   953 000006C9 C3                      		retn
   954                                  
   955                                  FreeModule:
   956                                  		; Erdogan Tan (13/02/2017)
   957                                  		; nothing to do here for memory de-allocation
   958                                  ClearModInfo:
   959 000006CA 57                      		push	edi
   960 000006CB BF[A0130000]            		mov	edi, ModInfo
   961 000006D0 B9FA010000              		mov     ecx, ModInfoRec.size
   962                                  		;cld
   963 000006D5 30C0                    		xor     al, al
   964 000006D7 F3AA                    		rep     stosb
   965 000006D9 5F                      		pop	edi
   966 000006DA C3                      		retn
   967                                  
   968                                  ;=============================================================================
   969                                  ;               MODPLAY.ASM
   970                                  ;=============================================================================
   971                                  
   972                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   973                                  ;		July 23th, 1993.
   974                                  
   975                                  ; EQUATES
   976                                  
   977                                  NumTracks       equ 4
   978                                  DefTempo        equ 6
   979                                  DefBpm          equ 125
   980                                  MidCRate        equ 8448
   981                                  MixBufSize      equ 4096
   982                                  
   983                                  ; STRUCTURES
   984                                  
   985                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   986 00000000 <res 00000004>          .Samples:	resd 1
   987                                  ;.Position:	resw 1
   988 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   989 00000008 <res 00000002>          .Len:		resw 1
   990 0000000A <res 00000002>          .Repeat:	resw 1
   991 0000000C <res 00000002>          .RepLen:	resw 1
   992 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   993 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   994                                  ;.Error:	resb 1
   995                                  ;.Reserved:	resb 1 ; 01/10/2017
   996 00000010 <res 00000002>          .Period:	resw 1 ; Period
   997 00000012 <res 00000002>          .Pitch:		resw 1 
   998 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   999 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
  1000 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
  1001 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
  1002 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
  1003 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
  1004 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
  1005                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
  1006 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
  1007 0000001E <res 00000006>          .Arp:		resw 3
  1008 00000024 <res 00000002>          .ArpIndex:	resw 1
  1009                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
  1010                                  endstruc
  1011                                  
  1012                                  ; CODE
  1013                                  
  1014                                  ;--------------------------------------------------------------------------
  1015                                  ; updatechannel - update the track using the current effect
  1016                                  ;--------------------------------------------------------------------------
  1017                                  ; 
  1018                                  ;--------------------------------------------------------------------------
  1019                                  ; BeatTrack:  Process the next beat in one track.
  1020                                  ;  In:
  1021                                  ;    ds:di -  Track info Address.
  1022                                  ;--------------------------------------------------------------------------
  1023                                  
  1024                                  ; edi = Track info address
  1025                                  
  1026                                  updatechannel:
  1027                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
  1028                                  
  1029 000006DB 668B5714                		mov     dx, [edi+TrackInfo.Effect]
  1030                                  
  1031                                  		;test   dx, dx
  1032                                  		;je     short None
  1033                                  		;cmp    dh, 00h
  1034                                  		;je     short Arpeggio
  1035                                  		;cmp    dh, 01h
  1036                                  		;je     short PortUp
  1037                                  		;cmp    dh, 02h
  1038                                  		;je     short PortDown
  1039                                  		;cmp    dh, 03h
  1040                                  		;je     TonePort
  1041                                  		;cmp    dh, 04h
  1042                                  		;je     Vibrato
  1043                                  		;cmp    dh, 05h
  1044                                  		;je     PortSlide
  1045                                  		;cmp    dh, 06h
  1046                                  		;je     VibSlide
  1047                                  		;cmp    dh, 0Ah
  1048                                  		;je     VolSlide
  1049                                  		;retn
  1050                                  
  1051 000006DF 0FB6C6                  		movzx	eax, dh
  1052 000006E2 240F                    		and	al, 0Fh
  1053 000006E4 FF2485[240D0000]        		jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
  1054                                  efxnull:
  1055                                  None:           
  1056 000006EB C3                      		retn
  1057                                  efxarpeggio2:
  1058                                  		; 01/10/2017
  1059 000006EC 84D2                    		test    dl, dl
  1060 000006EE 74FB                    		jz      short efxnull
  1061                                  Arpeggio:
  1062 000006F0 0FB75F24                		movzx   ebx, word [edi+TrackInfo.ArpIndex]
  1063 000006F4 668B441F1E              		mov     ax, [edi+TrackInfo.Arp+ebx]
  1064 000006F9 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1065 000006FD 6683C302                		add     bx, 2
  1066 00000701 6683FB06                		cmp     bx, 6
  1067 00000705 7202                    		jb      short SetArpIndex
  1068 00000707 31DB                    		xor     ebx, ebx
  1069                                  SetArpIndex:
  1070 00000709 66895F24                		mov     [edi+TrackInfo.ArpIndex], bx
  1071 0000070D C3                      		retn
  1072                                  efxportaup:
  1073                                  PortUp:
  1074 0000070E 30F6                    		xor     dh, dh
  1075                                  		;mov	bx, [edi+TrackInfo.Period]
  1076 00000710 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1077 00000714 6629D3                  		sub     bx, dx
  1078                                  		;cmp	bx, 113
  1079 00000717 6683FB1C                		cmp	bx, 28 ; 01/10/2017 
  1080 0000071B 7D04                    		jge     short NotSmall
  1081                                  		;mov	bx, 113
  1082 0000071D 66BB1C00                		mov	bx, 28 ; 01/10/2017
  1083                                  NotSmall:
  1084 00000721 66895F10                		mov     [edi+TrackInfo.Period], bx
  1085 00000725 6601DB                  		add     bx, bx
  1086                                  		;mov	ax, [PitchTable+bx]
  1087 00000728 668B83[9A150000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1088 0000072F 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1089 00000733 C3                      		retn
  1090                                  efxportadown:
  1091                                  PortDown:
  1092 00000734 30F6                    		xor     dh, dh
  1093                                  		;mov	bx, [edi+TrackInfo.Period]
  1094 00000736 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1095 0000073A 6601D3                  		add     bx, dx
  1096 0000073D 6681FB600D              		cmp	bx, 3424 ; 01/10/2017 
  1097                                  		;cmp	bx, 856
  1098 00000742 7E04                    		jle     short NotBig
  1099                                  		;mov	bx, 856
  1100 00000744 66BB600D                		mov	bx, 3424 ; 01/10/2017
  1101                                  NotBig:         
  1102 00000748 66895F10                		mov     [edi+TrackInfo.Period], bx
  1103 0000074C 6601DB                  		add     bx, bx
  1104                                  		;mov	ax, [PitchTable+bx]
  1105 0000074F 668B83[9A150000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1106 00000756 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1107 0000075A C3                      		retn
  1108                                  efxtoneporta2:
  1109                                  TonePort:
  1110 0000075B 30F6                    		xor     dh, dh
  1111 0000075D 668B4716                		mov     ax, [edi+TrackInfo.PortTo]
  1112                                  		;mov	bx, [edi+TrackInfo.Period]
  1113 00000761 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1114 00000765 6639C3                  		cmp     bx, ax
  1115 00000768 7429                    		je      short NoPort
  1116 0000076A 7F0D                    		jg      short PortToUp
  1117                                  PortToDown:     
  1118 0000076C 6601D3                  		add     bx, dx
  1119 0000076F 6639C3                  		cmp     bx, ax
  1120 00000772 7E0D                    		jle     short SetPort
  1121                                  FixPort:        
  1122 00000774 6689C3                  		mov     bx, ax
  1123 00000777 EB08                    		jmp     short SetPort
  1124                                  PortToUp:
  1125 00000779 6629D3                  		sub     bx, dx
  1126 0000077C 6639C3                  		cmp     bx, ax
  1127 0000077F 7CF3                    		jl      short FixPort
  1128                                  SetPort:        
  1129 00000781 66895F10                		mov     [edi+TrackInfo.Period], bx
  1130 00000785 6601DB                  		add     bx, bx
  1131                                  		;mov	ax, [PitchTable+bx]
  1132 00000788 668B83[9A150000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1133 0000078F 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1134                                  NoPort:         
  1135 00000793 C3                      		retn
  1136                                  efxvibrato2:
  1137                                  		; 01/10/2017
  1138                                  Vibrato:
  1139 00000794 88D6                    		mov     dh, dl
  1140                                  		;and	dl, 0Fh
  1141                                  		;shr	dh, 4
  1142                                  		;shl	dh, 2
  1143 00000796 6681E20FF0              		and     dx, 0F00Fh
  1144 0000079B C0EE02                  		shr     dh, 2
  1145                                  		;add	[edi+TrackInfo.VibPos], dh
  1146                                  		;mov	dh, [edi+TrackInfo.VibPos]
  1147                                  		;mov	bl, dh
  1148 0000079E 8A5F19                  		mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
  1149 000007A1 007719                  		add	[edi+TrackInfo.VibPos], dh
  1150 000007A4 88DE                    		mov	dh, bl ; 01/10/2017
  1151 000007A6 C0EB02                  		shr     bl, 2
  1152                                  		;and	bx, 1Fh
  1153                                  		;mov	al, [SinTable+bx]
  1154 000007A9 83E31F                  		and	ebx, 1Fh
  1155 000007AC 8A83[0C0E0000]          		mov	al, [SinTable+ebx]
  1156 000007B2 F6E2                    		mul     dl
  1157                                  		;rol	ax, 1
  1158                                  		;xchg	al, ah
  1159                                  		;and	ah, 1
  1160 000007B4 66C1E807                		shr	ax, 7
  1161 000007B8 84F6                    		test    dh, dh
  1162 000007BA 7903                    		jns     short VibUp
  1163 000007BC 66F7D8                  		neg     ax
  1164                                  VibUp:          
  1165 000007BF 66034710                		add     ax, [edi+TrackInfo.Period]
  1166 000007C3 6689C3                  		mov	bx, ax
  1167                                  		;movzx	ebx, ax
  1168 000007C6 6683FB71                		cmp     bx, 113
  1169                                  		;cmp	bx, 113
  1170 000007CA 6683FB1C                		cmp	bx, 28  ; 01/10/2017
  1171 000007CE 7D06                    		jge     short NoLoVib
  1172                                  		;mov	bx, 113
  1173 000007D0 66BB1C00                		mov	bx, 28	; 01/10/2017
  1174 000007D4 EB0B                    		jmp	short NoHiVib ; 01/10/2017	
  1175                                  NoLoVib:        
  1176 000007D6 6681FB600D              		cmp	bx, 3424 ; 01/10/2017 
  1177                                  		;cmp	bx, 856
  1178 000007DB 7E04                    		jle     short NoHiVib
  1179                                  		;mov	bx, 856
  1180 000007DD 66BB600D                		mov	bx, 3424 ; 01/10/2017
  1181                                  NoHiVib:        
  1182 000007E1 6601DB                  		add     bx, bx
  1183                                  		;mov	ax, [PitchTable+bx]
  1184 000007E4 668B83[9A150000]        		mov	ax, [PitchTable+ebx] ; 01/10/2017
  1185 000007EB 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1186 000007EF C3                      		retn
  1187                                  efxtoneslide:
  1188                                  PortSlide:
  1189 000007F0 E812000000              		call    VolSlide
  1190 000007F5 8A5718                  		mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1191 000007F8 E95EFFFFFF              		jmp     TonePort  ; efxtoneporta2
  1192                                  efxvibslide:
  1193                                  VibSlide:
  1194 000007FD E805000000              		call    VolSlide
  1195 00000802 8A571A                  		mov     dl, [edi+TrackInfo.VibParm]
  1196 00000805 EB8D                    		jmp     short Vibrato  ; efxvibrato2
  1197                                  efxvolslide:
  1198                                  VolSlide:
  1199 00000807 88D6                    		mov     dh, dl
  1200 00000809 80E20F                  		and     dl, 0Fh
  1201 0000080C C0EE04                  		shr     dh, 4
  1202 0000080F 8A470E                  		mov     al, [edi+TrackInfo.Volume]
  1203 00000812 28D0                    		sub     al, dl
  1204 00000814 7D02                    		jge     short NoLoVol
  1205 00000816 30C0                    		xor     al, al
  1206                                  NoLoVol:        
  1207 00000818 00F0                    		add     al, dh
  1208 0000081A 3C40                    		cmp     al, 64
  1209 0000081C 7602                    		jbe     short NoHiVol
  1210 0000081E B040                    		mov     al, 64
  1211                                  NoHiVol:        
  1212 00000820 88470E                  		mov     [edi+TrackInfo.Volume], al
  1213 00000823 C3                      		retn
  1214                                  
  1215                                  efxtremolo2:
  1216                                  		; 01/10/2017 (TMODPLAY.ASM)
  1217                                  Tremolo:
  1218 00000824 88D6                    		mov     dh, dl
  1219 00000826 6681E20FF0              		and     dx, 0F00Fh
  1220 0000082B C0EE02                  		shr     dh, 2
  1221 0000082E 8A5F1B                  		mov	bl, [edi+TrackInfo.TremPos]
  1222 00000831 00771B                  		add	[edi+TrackInfo.TremPos], dh
  1223 00000834 88DE                    		mov	dh, bl
  1224 00000836 C0EB02                  		shr     bl, 2
  1225                                  		; 01/10/2017 - TRDOS 386
  1226                                  		;and	bx, 1Fh
  1227 00000839 83E31F                  		and	ebx, 1Fh 
  1228                                  		;mov	al, [SinTable+bx]
  1229 0000083C 8A83[0C0E0000]          		mov     al, [SinTable+ebx]
  1230 00000842 F6E2                    		mul     dl
  1231 00000844 66C1E806                		shr	ax, 6
  1232 00000848 84F6                    		test    dh, dh
  1233 0000084A 7D03                    		jge	short Tremolo_1 ; efxtremolof2
  1234 0000084C 66F7D8                  		neg     ax
  1235                                  efxtremolof2:
  1236                                  Tremolo_1:      
  1237 0000084F 8A670E                  		mov	ah, [edi+TrackInfo.Volume]    
  1238 00000852 00E0                    		add     al, ah
  1239 00000854 7D02                    		jge     short Tremolo_2 ; efxtremolof3
  1240 00000856 30C0                    		xor     al, al
  1241                                  efxtremolof3:
  1242                                  Tremolo_2:       
  1243 00000858 3C40                    		cmp     al, 64 ; 40h
  1244 0000085A 7E02                    		jle     short Tremolo_3 ; efxtremolof4
  1245 0000085C B040                    		mov     al, 64 ; 40h
  1246                                  efxtremolof4:
  1247                                  Tremolo_3:       
  1248 0000085E 28E0                    		sub	al, ah  ; ****** 
  1249 00000860 88470F                  		mov     [edi+TrackInfo.VolDiff], al
  1250 00000863 C3                      		retn	
  1251                                  
  1252                                  ;--------------------------------------------------------------------------
  1253                                  ; readchannel - read the next note event from the pattern sheet
  1254                                  ;--------------------------------------------------------------------------
  1255                                  ;
  1256                                  ;--------------------------------------------------------------------------
  1257                                  ; GetTrack:   Get the next Note from a pattern.
  1258                                  ;  In:
  1259                                  ;    ds:di -  Track info Address.
  1260                                  ;    es:si -  Pattern Note Address.
  1261                                  ; Out:
  1262                                  ;    es:si -  The Next Pattern Note address.
  1263                                  ;--------------------------------------------------------------------------
  1264                                  
  1265                                  ; esi = Pattern note address
  1266                                  ; edi = Track info address
  1267                                  
  1268                                  readchannel:
  1269                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1270 00000864 66AD                    		lodsw
  1271 00000866 86C4                    		xchg    al, ah
  1272 00000868 88E3                    		mov	bl, ah
  1273 0000086A 80E40F                  		and     ah, 0Fh
  1274 0000086D 6689C1                  		mov     cx, ax
  1275 00000870 66AD                    		lodsw
  1276 00000872 86C4                    		xchg    al, ah
  1277 00000874 88E7                    		mov     bh, ah
  1278 00000876 80E40F                  		and     ah, 0Fh
  1279 00000879 6689C2                  		mov     dx, ax
  1280 0000087C 66895714                		mov     [edi+TrackInfo.Effect], dx
  1281                                  		; 01/10/2017 - TRDOS 386
  1282                                  		;and	bl, 0F0h
  1283 00000880 81E3F0FF0000            		and	ebx, 0FFF0h
  1284 00000886 C0EF04                  		shr     bh, 4
  1285 00000889 08FB                    		or      bl, bh
  1286 0000088B 7446                    		jz      short SetPeriod
  1287                                  SetSample:
  1288 0000088D 30FF                    		xor	bh, bh
  1289                                  		;and	ebx, 0FFh
  1290 0000088F FECB                    		dec     bl
  1291 00000891 01DB                    		add     ebx, ebx
  1292 00000893 668B83[5C150000]        		mov     ax, [ModInfo.SampVol+ebx]
  1293 0000089A 88470E                  		mov     [edi+TrackInfo.Volume], al
  1294 0000089D 668B83[26140000]        		mov     ax, [ModInfo.SampOfs+ebx]
  1295 000008A4 668907                  		mov     [edi+TrackInfo.Samples], ax
  1296 000008A7 668B83[64140000]        		mov     ax, [ModInfo.SampSeg+ebx]
  1297 000008AE 66894702                		mov     [edi+TrackInfo.Samples+2], ax
  1298 000008B2 668B83[A2140000]        		mov     ax, [ModInfo.SampLen+ebx]
  1299 000008B9 66894708                		mov     [edi+TrackInfo.Len], ax
  1300 000008BD 668B83[E0140000]        		mov     ax, [ModInfo.SampRep+ebx]
  1301 000008C4 6689470A                		mov     [edi+TrackInfo.Repeat], ax
  1302 000008C8 668B83[1E150000]        		mov     ax, [ModInfo.SampRepLen+ebx]
  1303 000008CF 6689470C                		mov     [edi+TrackInfo.RepLen], ax
  1304                                  SetPeriod:      
  1305 000008D3 6685C9                  		test    cx, cx
  1306 000008D6 7425                    		jz      short SetEffect
  1307                                  
  1308 000008D8 66894F16                		mov     [edi+TrackInfo.PortTo], cx ; *
  1309                                  		
  1310 000008DC 80FE03                  		cmp     dh, 03h
  1311                                  		;je	short SetEffect
  1312 000008DF 7428                    		je	short efxtoneporta ; 01/10/2017
  1313                                  
  1314 000008E1 66894F10                		mov     [edi+TrackInfo.Period], cx
  1315                                  		;movzx	ebx, cx
  1316 000008E5 6689CB                  		mov     bx, cx
  1317 000008E8 6601DB                  		add     bx, bx
  1318                                  		;mov	ax, [PitchTable+bx]
  1319 000008EB 668B83[9A150000]        		mov	ax, [PitchTable+ebx] ; 01/10/2017
  1320 000008F2 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1321 000008F6 C7470400000000          		mov     dword [edi+TrackInfo.Position], 0
  1322                                  SetEffect:
  1323                                  		;test	dx, dx
  1324                                  		;je	short InitNone
  1325                                  		;cmp	dh, 00h
  1326                                  		;je	InitArpeggio
  1327                                  		;cmp	dh, 03h
  1328                                  		;je	short InitTonePort
  1329                                  		;cmp	dh, 04h
  1330                                  		;je	short InitVibrato
  1331                                  		;cmp	dh, 09h
  1332                                  		;je	short SampleOfs
  1333                                  		;cmp	dh, 0Bh
  1334                                  		;je	short PosJump
  1335                                  		;cmp	dh, 0Ch
  1336                                  		;je	short SetVolume
  1337                                  		;cmp	dh, 0Dh
  1338                                  		;je	short Break
  1339                                  		;cmp	dh, 0Fh
  1340                                  		;je	SetSpeed
  1341                                  		;retn
  1342                                  
  1343                                  		; 01/10/2017 (TMODPLAY.ASM)
  1344                                  		
  1345                                  		; dx = [di+TrackInfo.Effect]
  1346                                  		
  1347 000008FD 0FB6C6                  		movzx	eax, dh
  1348 00000900 240F                    		and	al, 0Fh
  1349 00000902 FF2485[E40C0000]        		jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1350                                  ;efxnull:
  1351                                  ;InitNone:
  1352                                  ;		retn
  1353                                  efxtoneporta:
  1354                                  		; 01/10/2017
  1355                                  		; cx = period
  1356                                  		;mov	[edi+TrackInfo.PortTo], cx ; *
  1357                                  InitTonePort:
  1358 00000909 84D2                    		test    dl, dl
  1359 0000090B 7503                    		jnz     short SetPortParm
  1360 0000090D 8A5718                  		mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1361                                  SetPortParm:    
  1362 00000910 885718                  		mov     [edi+TrackInfo.PortParm], dl
  1363 00000913 66895714                		mov     [edi+TrackInfo.Effect], dx
  1364 00000917 C3                      		retn
  1365                                  efxvibrato:
  1366                                  InitVibrato:
  1367 00000918 8A471A                  		mov     al, [edi+TrackInfo.VibParm]
  1368 0000091B 88C4                    		mov     ah, al
  1369                                  		;and	al, 0Fh
  1370                                  		;and	ah, 0F0h
  1371 0000091D 66250FF0                		and	ax, 0F00Fh
  1372 00000921 F6C20F                  		test    dl, 0Fh
  1373 00000924 7502                    		jne     short OkDepth
  1374 00000926 08C2                    		or      dl, al
  1375                                  OkDepth:        
  1376 00000928 F6C2F0                  		test    dl, 0F0h
  1377 0000092B 7502                    		jnz     short OkRate
  1378 0000092D 08E2                    		or      dl, ah
  1379                                  OkRate:         
  1380 0000092F 88571A                  		mov     [edi+TrackInfo.VibParm], dl
  1381 00000932 66895714                		mov     [edi+TrackInfo.Effect], dx
  1382 00000936 6685C9                  		test    cx, cx
  1383 00000939 7404                    		jz      short OkPos
  1384 0000093B C6471900                		mov     byte [edi+TrackInfo.VibPos], 0
  1385                                  OkPos:          
  1386 0000093F C3                      		retn
  1387                                  efxsampoffset:
  1388                                  		; 01/10/2017 ; *******
  1389                                  SampleOfs:         
  1390                                  ;		test    dl, dl
  1391                                  ;		jnz     short SetSampleOfs
  1392                                  ;		mov     dl, [edi+TrackInfo.OldSampOfs]
  1393                                  ;SetSampleOfs:
  1394                                  ;		mov     [edi+TrackInfo.OldSampOfs], dl
  1395 00000940 88D6                    		mov     dh, dl
  1396 00000942 81E200FF0000            		and 	edx, 0FF00h ; 05/03/2017
  1397 00000948 895704                  		mov     [edi+TrackInfo.Position], edx
  1398 0000094B C3                      		retn
  1399                                  efxpattjump:
  1400                                  PosJump:
  1401 0000094C 8815[5C810000]          		mov     [OrderPos], dl
  1402 00000952 C605[60810000]40        		mov     byte [Row], 64
  1403 00000959 C3                      		retn
  1404                                  efxsetvolume:
  1405                                  SetVolume:
  1406 0000095A 80FA40                  		cmp     dl, 64
  1407 0000095D 7602                    		jbe     short OkVol
  1408 0000095F B240                    		mov     dl, 64
  1409                                  OkVol:
  1410                                  		; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1411 00000961 30F6                    		xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1412                                  		;mov	[edi+TrackInfo.Volume], dl
  1413 00000963 6689570E                		mov	[edi+TrackInfo.Volume], dx 
  1414 00000967 C3                      		retn
  1415                                  efxbreak:
  1416                                  Break:
  1417 00000968 88D6                    		mov     dh, dl
  1418 0000096A 80E20F                  		and     dl, 0Fh
  1419 0000096D C0EE04                  		shr     dh, 4
  1420 00000970 00F6                    		add     dh, dh
  1421 00000972 00F2                    		add     dl, dh
  1422 00000974 C0E602                  		shl     dh, 2
  1423 00000977 00F2                    		add     dl, dh
  1424 00000979 8815[61810000]          		mov     [BreakRow], dl
  1425 0000097F C605[60810000]40        		mov     byte [Row], 64
  1426 00000986 C3                      		retn
  1427                                  efxsetspeed:
  1428                                  SetSpeed:
  1429 00000987 84D2                    		test    dl,dl
  1430 00000989 7432                    		je      Skip
  1431 0000098B 80FA1F                  		cmp     dl,31
  1432 0000098E 770D                    		ja      short SetBpm
  1433                                  SetTempo:       
  1434 00000990 8815[5D810000]          		mov     [Tempo], dl
  1435 00000996 8815[5E810000]          		mov     [TempoWait], dl
  1436 0000099C C3                      		retn
  1437                                  SetBpm:
  1438 0000099D 8815[5F810000]          		mov     [Bpm], dl
  1439 000009A3 B067                    		mov     al, 103
  1440 000009A5 F6E2                    		mul     dl
  1441 000009A7 88E3                    		mov     bl, ah
  1442 000009A9 30FF                    		xor     bh, bh
  1443 000009AB 66A1[9E130000]          		mov     ax, [MixSpeed]
  1444 000009B1 6631D2                  		xor     dx, dx
  1445 000009B4 66F7F3                  		div     bx
  1446 000009B7 66A3[62810000]          		mov     [BpmSamples], ax
  1447                                  Skip:           
  1448 000009BD C3                      		retn
  1449                                  efxarpeggio:
  1450                                  		; 01/10/2017
  1451 000009BE 84D2                    		test    dl, dl
  1452                                  		;je	efxnull
  1453 000009C0 74FB                    		je	short Skip
  1454                                  InitArpeggio:
  1455 000009C2 88D6                    		mov     dh, dl
  1456 000009C4 80E20F                  		and     dl, 0Fh
  1457 000009C7 C0EE04                  		shr     dh, 4
  1458                                  		; 01/10/2017
  1459                                  		;mov	cx, 36
  1460 000009CA 66B95400                		mov	cx, 84 ; 84 notes/periods
  1461 000009CE 31DB                    		xor     ebx, ebx
  1462 000009D0 668B4710                		mov     ax, [edi+TrackInfo.Period]
  1463                                  gt_ScanPeriod:
  1464                                  		;cmp	ax, [PeriodTable+bx]
  1465 000009D4 663B83[640D0000]        		cmp	ax, [PeriodTable+ebx]
  1466 000009DB 7306                    		jae     short SetArp
  1467 000009DD 6683C302                		add     bx, 2
  1468 000009E1 E2F1                    		loop    gt_ScanPeriod
  1469                                  SetArp:         
  1470 000009E3 6601D2                  		add     dx, dx
  1471 000009E6 00DE                    		add     dh, bl
  1472 000009E8 00DA                    		add     dl, bl
  1473                                  		; 01/10/2017
  1474                                  		;mov	bx, [PeriodTable+bx]
  1475 000009EA 668B9B[640D0000]        		mov	bx, [PeriodTable+ebx]
  1476                                  		;add	bx, bx
  1477 000009F1 01DB                    		add	ebx, ebx
  1478                                  		;mov	ax, [PitchTable+bx]
  1479 000009F3 668B83[9A150000]        		mov	ax, [PitchTable+ebx]
  1480 000009FA 6689471E                		mov     [edi+TrackInfo.Arp], ax
  1481 000009FE 88F3                    		mov     bl, dh
  1482 00000A00 30FF                    		xor     bh, bh
  1483 00000A02 668B9B[640D0000]        		mov	bx, [PeriodTable+ebx]
  1484                                  		;add	bx, bx
  1485 00000A09 01DB                    		add	ebx, ebx
  1486                                  		;mov	ax, [PitchTable+bx]
  1487 00000A0B 668B83[9A150000]        		mov	ax, [PitchTable+ebx]
  1488 00000A12 66894720                		mov     [edi+TrackInfo.Arp+2], ax
  1489 00000A16 88D3                    		mov     bl, dl
  1490 00000A18 30FF                    		xor     bh, bh
  1491 00000A1A 668B9B[640D0000]        		mov	bx, [PeriodTable+ebx]
  1492                                  		;add	bx, bx
  1493 00000A21 01DB                    		add	ebx, ebx
  1494                                  		;mov	ax, [PitchTable+bx]
  1495 00000A23 668B83[9A150000]        		mov	ax, [PitchTable+ebx]
  1496 00000A2A 66894722                		mov     [edi+TrackInfo.Arp+4], ax
  1497 00000A2E 66C747240000            		mov     word [edi+TrackInfo.ArpIndex], 0
  1498 00000A34 C3                      		retn
  1499                                  
  1500                                  efxtremolo:
  1501                                  		; 01/10/2017 (TMODPLAY.ASM)
  1502                                  InitTremolo:
  1503 00000A35 8A471C                  		mov     al, [edi+TrackInfo.TremParm]
  1504 00000A38 88C4                    		mov     ah, al
  1505 00000A3A 66250FF0                		and     ax, 0F00Fh
  1506 00000A3E F6C20F                  		test    dl, 0Fh
  1507 00000A41 7502                    		jnz     short InitTremolo_1 ; efxtremolof0
  1508 00000A43 08C2                    		or      dl, al
  1509                                  efxtremolof0:
  1510                                  InitTremolo_1: 
  1511 00000A45 F6C2F0                  		test    dl, 0F0h
  1512 00000A48 7502                    		jnz     short InitTremolo_2 ; efxtremolof1
  1513 00000A4A 08E2                    		or      dl, ah
  1514                                  efxtremolof1:
  1515                                  InitTremolo_2:
  1516 00000A4C 88571C                  		mov     [edi+TrackInfo.TremParm], dl
  1517 00000A4F 66895714                		mov     [edi+TrackInfo.Effect], dx
  1518 00000A53 C3                      		retn
  1519                                  
  1520                                  ;--------------------------------------------------------------------------
  1521                                  ; pollmodule - polls the module player
  1522                                  ;--------------------------------------------------------------------------
  1523                                  ;--------------------------------------------------------------------------
  1524                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1525                                  ;--------------------------------------------------------------------------
  1526                                  
  1527                                  pollmodule:
  1528                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1529 00000A54 FE0D[5E810000]          		dec     byte [TempoWait]
  1530 00000A5A 7415                    		jz      short GetTracks
  1531                                  
  1532 00000A5C B904000000              		mov	ecx, NumTracks
  1533 00000A61 BF[72810000]            		mov	edi, Tracks
  1534                                  BeatTracks:
  1535 00000A66 E870FCFFFF              		call	BeatTrack	
  1536 00000A6B 83C726                  		add	edi, TrackInfo.size
  1537 00000A6E E2F6                    		loop	BeatTracks
  1538 00000A70 C3                      		retn
  1539                                  GetTracks:
  1540 00000A71 A0[5D810000]            		mov     al, [Tempo]
  1541 00000A76 A2[5E810000]            		mov     [TempoWait], al
  1542                                  
  1543 00000A7B 8B35[6E810000]          		mov	esi, [Note]
  1544 00000A81 803D[60810000]40        		cmp     byte [Row], 64
  1545 00000A88 7263                    		jb      short NoPattWrap
  1546                                  
  1547 00000A8A 8B35[22140000]          		mov	esi, [ModInfo.Patterns]
  1548 00000A90 8A1D[5C810000]          		mov     bl, [OrderPos]
  1549 00000A96 3A1D[A0130000]          		cmp     bl, [ModInfo.OrderLen]
  1550 00000A9C 7214                    		jb      short NoOrderWrap
  1551 00000A9E 8A1D[A1130000]          		mov     bl, [ModInfo.ReStart]
  1552 00000AA4 881D[5C810000]          		mov     [OrderPos], bl
  1553 00000AAA 3A1D[A0130000]          		cmp     bl, [ModInfo.OrderLen]
  1554 00000AB0 735D                    		jae     short NoUpdate
  1555                                  NoOrderWrap:    
  1556                                  		;xor	bh, bh
  1557 00000AB2 81E3FF000000            		and	ebx, 0FFh
  1558 00000AB8 8A9B[A2130000]          		mov     bl, [ModInfo.Order+ebx]
  1559 00000ABE C1E30A                  		shl	ebx, 10 ; *1024
  1560 00000AC1 01DE                    		add     esi, ebx
  1561 00000AC3 8A1D[61810000]          		mov     bl, [BreakRow]
  1562 00000AC9 881D[60810000]          		mov     [Row], bl
  1563                                  		;xor	bh, bh
  1564 00000ACF 81E3FF000000            		and	ebx, 0FFh
  1565 00000AD5 883D[61810000]          		mov     [BreakRow], bh ; 0
  1566 00000ADB 66C1E304                		shl     bx, 4
  1567 00000ADF 01DE                    		add     esi, ebx
  1568 00000AE1 8935[6E810000]          		mov     [Note], esi
  1569 00000AE7 FE05[5C810000]          		inc     byte [OrderPos]
  1570                                  NoPattWrap:     
  1571 00000AED FE05[60810000]          		inc     byte [Row]
  1572                                  
  1573                                  		;cld
  1574 00000AF3 B904000000              		mov	ecx, NumTracks
  1575 00000AF8 BF[72810000]            		mov	edi, Tracks
  1576                                  GetTracks_next:
  1577 00000AFD 51                      		push	ecx		
  1578 00000AFE E861FDFFFF              		call	GetTrack ; readchannel
  1579 00000B03 59                      		pop	ecx
  1580 00000B04 83C726                  		add	edi, TrackInfo.size
  1581 00000B07 E2F4                    		loop	GetTracks_next
  1582                                  
  1583 00000B09 8935[6E810000]          		mov     [Note], esi
  1584                                  NoUpdate:
  1585 00000B0F C3                      		retn
  1586                                  
  1587                                  ;--------------------------------------------------------------------------
  1588                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1589                                  ;  In:
  1590                                  ;   ds:si -  Track Info Address.
  1591                                  ;   ds:di -  Buffer Address.
  1592                                  ;    cx   -  Buffer Size.
  1593                                  ;--------------------------------------------------------------------------
  1594                                  
  1595                                  ; esi = Track info address
  1596                                  ; edi = Buffer address
  1597                                  ; ecx = Buffer size
  1598                                  
  1599                                  MixTrack:
  1600 00000B10 66837E0C02              		cmp     word [esi+TrackInfo.RepLen], 2
  1601 00000B15 7752                    		ja      short MixLooped
  1602                                  MixNonLooped:   
  1603 00000B17 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1604 00000B19 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1605 00000B1C 0FB76E08                		movzx   ebp, word [esi+TrackInfo.Len]
  1606 00000B20 52                      		push    edx
  1607 00000B21 56                      		push    esi
  1608 00000B22 01D3                    		add     ebx, edx
  1609 00000B24 01D5                    		add     ebp, edx
  1610 00000B26 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1611                                  		; 01/10/2017
  1612                                  		;mov	al, [esi+TrackInfo.Volume]
  1613 00000B2A 668B460E                		mov	ax, [esi+TrackInfo.Volume]
  1614                                  		; ah = [esi+TrackInfo.VolDiff]
  1615 00000B2E 00E0                    		add	al, ah ; ****** 
  1616 00000B30 C6460F00                		mov	byte [esi+TrackInfo.VolDiff], 0
  1617 00000B34 8A661D                  		mov     ah, [esi+TrackInfo.Error]
  1618 00000B37 89DE                    		mov     esi, ebx
  1619 00000B39 31DB                    		xor	ebx, ebx ; 01/10/2017 ; *
  1620 00000B3B 88C7                    		mov     bh, al
  1621 00000B3D 88D0                    		mov     al, dl
  1622 00000B3F 88F2                    		mov     dl, dh
  1623                                  		;xor	dh, dh
  1624 00000B41 81E2FF000000            		and	edx, 0FFh
  1625                                  nlMixSamp:      
  1626 00000B47 39EE                    		cmp     esi, ebp
  1627 00000B49 7311                    		jae     short nlMixBye
  1628 00000B4B 8A1E                    		mov     bl, [esi]
  1629                                  		;mov	bl, [VolTable+bx]
  1630 00000B4D 8A9B[5C300000]          		mov	bl, [VolTable+ebx] ; 01/10/2017 ; *		
  1631 00000B53 001F                    		add     [edi], bl
  1632 00000B55 47                      		inc     edi
  1633 00000B56 00C4                    		add     ah, al
  1634 00000B58 11D6                    		adc     esi, edx
  1635 00000B5A E2EB                    		loop    nlMixSamp
  1636                                  nlMixBye:       
  1637 00000B5C 89F3                    		mov     ebx, esi
  1638 00000B5E 5E                      		pop     esi
  1639 00000B5F 5A                      		pop     edx
  1640 00000B60 29D3                    		sub     ebx, edx
  1641 00000B62 895E04                  		mov     [esi+TrackInfo.Position], ebx
  1642 00000B65 88661D                  		mov     [esi+TrackInfo.Error], ah
  1643 00000B68 C3                      		retn
  1644                                  MixLooped:
  1645 00000B69 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1646 00000B6B 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1647 00000B6E 0FB76E0C                		movzx	ebp, word [esi+TrackInfo.RepLen]
  1648 00000B72 892D[6A810000]          		mov     [BufRep], ebp
  1649                                  		;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1650 00000B78 66036E0A                		add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1651 00000B7C 52                      		push    edx
  1652 00000B7D 56                      		push    esi
  1653 00000B7E 01D3                    		add     ebx, edx
  1654 00000B80 01D5                    		add     ebp, edx
  1655 00000B82 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1656                                  		; 01/10/2017
  1657                                  		;mov	al, [esi+TrackInfo.Volume]
  1658 00000B86 668B460E                		mov	ax, [esi+TrackInfo.Volume]
  1659                                  		; ah = [esi+TrackInfo.VolDiff]
  1660 00000B8A 00E0                    		add	al, ah ; ****** 
  1661 00000B8C C6460F00                		mov	byte [esi+TrackInfo.VolDiff], 0
  1662 00000B90 8A661D                  		mov     ah, [esi+TrackInfo.Error]
  1663                                  		;mov	si, bx
  1664 00000B93 89DE                    		mov	esi, ebx ; 04/09/2017
  1665 00000B95 31DB                    		xor	ebx, ebx ; 01/10/2017 ; *
  1666 00000B97 88C7                    		mov     bh, al
  1667 00000B99 88D0                    		mov     al, dl
  1668 00000B9B 88F2                    		mov     dl, dh
  1669                                  		;xor	dh, dh
  1670 00000B9D 81E2FF000000            		and	edx, 0FFh
  1671                                  lpMixSamp:      
  1672 00000BA3 39EE                    		cmp     esi, ebp
  1673 00000BA5 7206                    		jb      short lpMixNow
  1674 00000BA7 2B35[6A810000]          		sub     esi, [BufRep]
  1675                                  lpMixNow:       
  1676 00000BAD 8A1E                    		mov     bl, [esi]
  1677                                  		;mov	bl, [VolTable+bx]
  1678 00000BAF 8A9B[5C300000]          		mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1679 00000BB5 001F                    		add     [edi], bl
  1680 00000BB7 47                      		inc     edi
  1681 00000BB8 00C4                    		add     ah, al
  1682 00000BBA 11D6                    		adc	esi, edx
  1683 00000BBC E2E5                    		loop    lpMixSamp
  1684                                  lpMixBye:       
  1685                                  ;		mov     ebx, esi
  1686                                  ;		pop     esi
  1687                                  ;		pop     edx
  1688                                  ;		sub     ebx, edx
  1689                                  ;		mov     [esi+TrackInfo.Position], ebx
  1690                                  ;		mov     [esi+TrackInfo.Error], ah
  1691                                  ;		retn
  1692 00000BBE EB9C                    		jmp	short nlMixBye
  1693                                  
  1694                                  ;--------------------------------------------------------------------------
  1695                                  ; mixpoll - updates the output buffer
  1696                                  ;--------------------------------------------------------------------------
  1697                                  ;
  1698                                  ;--------------------------------------------------------------------------
  1699                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1700                                  ;  In:
  1701                                  ;    Buffer  - Buffer Address.
  1702                                  ;    Count   - Buffer Size.
  1703                                  ;--------------------------------------------------------------------------
  1704                                  
  1705                                  mixpoll:
  1706                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1707                                  		; edi = buffer address
  1708                                  		; ebx = count
  1709                                  
  1710 00000BC0 60                      		pushad
  1711                                  
  1712                                  		;cld
  1713                                  NextChunk:      
  1714 00000BC1 66833D[68810000]00      		cmp     word [BufLen], 0
  1715 00000BC9 7546                    		jne     short CopyChunk
  1716                                  
  1717 00000BCB 53                      		push    ebx
  1718 00000BCC 57                      		push    edi
  1719                                  MixChunk:       
  1720 00000BCD BF[5C710000]            		mov	edi, MixBuffer
  1721 00000BD2 0FB70D[62810000]        		movzx	ecx, word [BpmSamples]
  1722                                  		;mov	cx, [BpmSamples]
  1723 00000BD9 893D[64810000]          		mov     [BufPtr], edi
  1724 00000BDF 66890D[68810000]        		mov     [BufLen], cx
  1725                                  
  1726 00000BE6 B080                    		mov     al, 80h
  1727 00000BE8 F3AA                    		rep     stosb
  1728                                  
  1729                                  		;mov	cx, NumTracks
  1730 00000BEA B104                    		mov	cl, NumTracks ; 01/10/2017
  1731 00000BEC BE[4C810000]            		mov	esi, Tracks - TrackInfo.size
  1732                                  GetSamples_next:
  1733 00000BF1 51                      		push	ecx
  1734 00000BF2 83C626                  		add	esi, TrackInfo.size
  1735 00000BF5 668B0D[68810000]        		mov	cx, [BufLen]
  1736 00000BFC 8B3D[64810000]          		mov	edi, [BufPtr]
  1737 00000C02 E809FFFFFF              		call	MixTrack
  1738 00000C07 59                      		pop	ecx
  1739 00000C08 E2E7                    		loop	GetSamples_next		
  1740                                  
  1741 00000C0A E845FEFFFF              		call    UpdateTracks
  1742                                  
  1743 00000C0F 5F                      		pop     edi
  1744 00000C10 5B                      		pop     ebx
  1745                                  CopyChunk:      
  1746                                  		;mov	cx, [BufLen]
  1747 00000C11 0FB70D[68810000]        		movzx	ecx, word [BufLen]
  1748 00000C18 39D9                    		cmp	ecx, ebx
  1749                                  		;cmp	cx, bx
  1750 00000C1A 7602                    		jbe     short MoveChunk
  1751                                  		;mov	cx, bx
  1752 00000C1C 89D9                    		mov     ecx, ebx
  1753                                  MoveChunk:
  1754 00000C1E 8B35[64810000]          		mov     esi, [BufPtr]
  1755 00000C24 010D[64810000]          		add     [BufPtr], ecx
  1756 00000C2A 66290D[68810000]        		sub     [BufLen], cx
  1757 00000C31 29CB                    		sub     ebx, ecx
  1758 00000C33 F3A4                    		rep     movsb
  1759 00000C35 85DB                    		test    ebx, ebx
  1760 00000C37 7588                    		jnz     short NextChunk
  1761                                  
  1762 00000C39 61                      		popad	
  1763 00000C3A C3                      		retn
  1764                                  
  1765                                  ;--------------------------------------------------------------------------
  1766                                  ; StartPlaying: Initializes the Sound System.
  1767                                  ;  In:
  1768                                  ;   Module Information Resources.
  1769                                  ;--------------------------------------------------------------------------
  1770                                  
  1771                                  StartPlaying:
  1772 00000C3B 60                      		pushad
  1773                                  SetModParms:    
  1774 00000C3C C605[5C810000]00        		mov     byte [OrderPos], 0
  1775 00000C43 C605[5D810000]06        		mov     byte [Tempo], DefTempo
  1776 00000C4A C605[5E810000]06        		mov     byte [TempoWait], DefTempo
  1777 00000C51 C605[5F810000]7D        		mov     byte [Bpm], DefBpm
  1778 00000C58 C605[60810000]40        		mov     byte [Row], 64
  1779 00000C5F C605[61810000]00        		mov     byte [BreakRow], 0
  1780 00000C66 66A1[9E130000]          		mov     ax, [MixSpeed]
  1781 00000C6C 31D2                    		xor     edx, edx
  1782 00000C6E 66BB3200                		mov     bx, 24*DefBpm/60
  1783 00000C72 66F7F3                  		div     bx
  1784 00000C75 66A3[62810000]          		mov     [BpmSamples], ax
  1785                                  ClearTracks:    
  1786 00000C7B BF[72810000]            		mov     edi, Tracks
  1787 00000C80 B998000000              		mov	ecx, NumTracks*TrackInfo.size
  1788 00000C85 31C0                    		xor     eax, eax
  1789                                  		;cld
  1790 00000C87 F3AA                    		rep     stosb
  1791                                  
  1792 00000C89 A3[64810000]            		mov     [BufPtr], eax
  1793 00000C8E 66A3[68810000]          		mov     [BufLen], ax
  1794                                  MakePitch:
  1795 00000C94 66B80021                		mov     ax, MidCRate
  1796 00000C98 66BBAC01                		mov     bx, 428
  1797 00000C9C 66F7E3                  		mul     bx
  1798 00000C9F 66F735[9E130000]        		div     word [MixSpeed]
  1799 00000CA6 30F6                    		xor     dh, dh
  1800 00000CA8 88E2                    		mov     dl, ah
  1801 00000CAA 88C4                    		mov     ah, al
  1802 00000CAC 30C0                    		xor     al, al
  1803                                  		;mov	cx, 857
  1804 00000CAE 66B9610D                		mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1805 00000CB2 31DB                    		xor     ebx, ebx
  1806 00000CB4 BF[9A150000]            		mov     edi, PitchTable
  1807                                  PitchLoop:      
  1808 00000CB9 50                      		push    eax
  1809 00000CBA 52                      		push    edx
  1810 00000CBB 6639DA                  		cmp     dx, bx
  1811 00000CBE 7303                    		jae     short NoDiv
  1812 00000CC0 66F7F3                  		div     bx
  1813                                  NoDiv:          
  1814 00000CC3 66AB                    		stosw
  1815 00000CC5 5A                      		pop     edx
  1816 00000CC6 58                      		pop     eax
  1817                                  		;inc	bx
  1818 00000CC7 43                      		inc	ebx
  1819 00000CC8 E2EF                    		loop    PitchLoop
  1820                                  MakeVolume:     
  1821 00000CCA 66B90041                		mov     cx, 16640
  1822 00000CCE 89CB                    		mov     ebx, ecx
  1823                                  VolLoop:
  1824 00000CD0 664B                    		dec     bx
  1825 00000CD2 88D8                    		mov     al, bl
  1826 00000CD4 F6EF                    		imul    bh
  1827                                  		;mov	[VolTable+bx], ah
  1828 00000CD6 88A3[5C300000]          		mov     [VolTable+ebx], ah
  1829 00000CDC E2F2                    		loop    VolLoop
  1830                                  
  1831 00000CDE 61                      		popad
  1832                                  		;retn
  1833                                  
  1834                                  ;--------------------------------------------------------------------------
  1835                                  ; StopPlaying: ShutDown the Sound System.
  1836                                  ;--------------------------------------------------------------------------
  1837                                  
  1838                                  StopPlaying:
  1839 00000CDF C3                      		retn
  1840                                  
  1841                                  ;=============================================================================
  1842                                  ;               preinitialized data
  1843                                  ;=============================================================================
  1844                                  
  1845                                  ;=============================================================================
  1846                                  ;               SB.ASM - DATA
  1847                                  ;=============================================================================
  1848                                  
  1849 00000CE0 2002                    SbAddr:		dw      220h
  1850 00000CE2 07                      SbIrq:		db      7
  1851                                  ;Srbs:		db	0
  1852                                  
  1853                                  ;=============================================================================
  1854                                  ; Protracker effects stuff
  1855                                  ;=============================================================================
  1856                                  
  1857                                  ;-----------------------------------------------------------------------------
  1858                                  ; Effect jump tables
  1859                                  ;-----------------------------------------------------------------------------
  1860                                  
  1861 00000CE3 90                      align 4
  1862                                  
  1863                                  efxtable:
  1864 00000CE4 [BE090000]              	dd      efxarpeggio	; 0 - arpeggio
  1865 00000CE8 [EB060000]              	dd      efxnull		; 1 - porta up
  1866 00000CEC [EB060000]              	dd      efxnull		; 2 - porta down
  1867 00000CF0 [09090000]              	dd      efxtoneporta	; 3 - tone porta
  1868 00000CF4 [18090000]              	dd      efxvibrato	; 4 - vibrato
  1869 00000CF8 [EB060000]              	dd      efxnull		; 5 - tone+slide
  1870 00000CFC [EB060000]              	dd      efxnull		; 6 - vibrato+slide
  1871 00000D00 [350A0000]              	dd      efxtremolo	; 7 - tremolo
  1872 00000D04 [EB060000]              	dd      efxnull		; 8 - unused
  1873 00000D08 [40090000]              	dd      efxsampoffset	; 9 - sample offset
  1874 00000D0C [EB060000]              	dd      efxnull		; A - volume slide
  1875 00000D10 [4C090000]              	dd      efxpattjump	; B - pattern jump
  1876 00000D14 [5A090000]              	dd      efxsetvolume	; C - set volume
  1877 00000D18 [68090000]              	dd      efxbreak	; D - break pattern
  1878 00000D1C [EB060000]              	dd      efxnull		; E - extra effects
  1879 00000D20 [87090000]              	dd      efxsetspeed	; F - set speed
  1880                                  
  1881                                  efxtable2:
  1882 00000D24 [EC060000]              	dd      efxarpeggio2	; 0 - arpeggio
  1883 00000D28 [0E070000]              	dd      efxportaup	; 1 - porta up
  1884 00000D2C [34070000]              	dd      efxportadown	; 2 - porta down
  1885 00000D30 [5B070000]              	dd      efxtoneporta2	; 3 - tone porta
  1886 00000D34 [94070000]              	dd      efxvibrato2	; 4 - vibrato
  1887 00000D38 [F0070000]              	dd      efxtoneslide	; 5 - tone+slide
  1888 00000D3C [FD070000]              	dd      efxvibslide	; 6 - vibrato+slide
  1889 00000D40 [24080000]              	dd      efxtremolo2	; 7 - tremolo
  1890 00000D44 [EB060000]              	dd      efxnull		; 8 - unused
  1891 00000D48 [EB060000]              	dd      efxnull		; 9 - sample offset
  1892 00000D4C [07080000]              	dd      efxvolslide	; A - volume slide
  1893 00000D50 [EB060000]              	dd      efxnull		; B - pattern jump
  1894 00000D54 [EB060000]              	dd      efxnull		; C - set volume
  1895 00000D58 [EB060000]              	dd      efxnull		; D - break pattern
  1896 00000D5C [EB060000]              	dd      efxnull		; E - extra effects
  1897 00000D60 [EB060000]              	dd      efxnull		; F - set speed 
  1898                                  
  1899                                  ;-----------------------------------------------------------------------------
  1900                                  ; Amiga period table
  1901                                  ;-----------------------------------------------------------------------------
  1902                                  
  1903                                  ;PeriodTable0:	
  1904                                  ;	dw	0
  1905                                  PeriodTable:
  1906 00000D64 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1906 00000D6D 0A000A7009E8086808-
  1906 00000D76 F00780071407       
  1907 00000D7C B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1907 00000D85 050005B80474043404-
  1907 00000D8E F803C0038A03       
  1908 00000D94 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1908 00000D9D 0280025C023A021A02-
  1908 00000DA6 FC01E001C501       
  1909 00000DAC AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1909 00000DB5 0140012E011D010D01-
  1909 00000DBE FE00F000E200       
  1910 00000DC4 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1910 00000DCD 00A00097008F008700-
  1910 00000DD6 7F0078007100       
  1911 00000DDC 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1911 00000DE5 0050004B0047004300-
  1911 00000DEE 3F003C003800       
  1912 00000DF4 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1912 00000DFD 002800250023002100-
  1912 00000E06 1F001E001C00       
  1913                                  
  1914                                  ;-----------------------------------------------------------------------------
  1915                                  ; Sinus wave table
  1916                                  ;-----------------------------------------------------------------------------
  1917                                  
  1918                                  SinTable:
  1919 00000E0C 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1919 00000E15 C5D4E1             
  1920 00000E18 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1920 00000E21 E1                 
  1921 00000E22 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1921 00000E2B 19                 
  1922                                  
  1923                                  ;=============================================================================
  1924                                  ; Copyright Strings & Messages
  1925                                  ;=============================================================================
  1926 00000E2C 0000                    		dw	0
  1927                                  msg_usage:
  1928 00000E2E 54696E79204D4F4420-     		db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1928 00000E37 506C6179657220666F-
  1928 00000E40 72205452444F532033-
  1928 00000E49 383620627920457264-
  1928 00000E52 6F67616E2054616E2E-
  1928 00000E5B 20                 
  1929 00000E5C 4F63746F6265722032-     		db	'October 2017.',10,13
  1929 00000E65 3031372E0A0D       
  1930 00000E6B 75736167653A207469-     		db	'usage: tinyplay filename.mod', 10, 13,0
  1930 00000E74 6E79706C6179206669-
  1930 00000E7D 6C656E616D652E6D6F-
  1930 00000E86 640A0D00           
  1931 00000E8A 30372F31302F323031-     		db	'07/10/2017',0
  1931 00000E93 3700               
  1932                                  
  1933                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1934                                  
  1935 00000E95 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1935 00000E9E 506C61796572207630-
  1935 00000EA7 2E3162206279204361-
  1935 00000EB0 726C6F732048617361-
  1935 00000EB9 6E2E204A756C792031-
  1935 00000EC2 3939332E           
  1936 00000EC6 0A0D00                  		db	10,13,0
  1937 00000EC9 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1937 00000ED2 64696E67204D6F6475-
  1937 00000EDB 6C652066696C652E0A-
  1937 00000EE4 0D00               
  1938 00000EE6 536F756E6420426C61-     MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1938 00000EEF 73746572206E6F7420-
  1938 00000EF8 666F756E64206F7220-
  1938 00000F01 495251206572726F72-
  1938 00000F0A 2E0A0D00           
  1939 00000F0E 536F756E6420426C61-     MsgFound:	db	'Sound Blaster found at Address 2'
  1939 00000F17 7374657220666F756E-
  1939 00000F20 642061742041646472-
  1939 00000F29 6573732032         
  1940 00000F2E 7830682C2049525120      PortText:	db	'x0h, IRQ '
  1941 00000F37 782E0A0D00              IrqText:	db	'x.',10,13,0
  1942                                  
  1943                                  trdos386_err_msg:
  1944 00000F3C 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1944 00000F45 2053797374656D2063-
  1944 00000F4E 616C6C206572726F72-
  1944 00000F57 20210A0D00         
  1945                                  
  1946                                  bss_start:
  1947                                  
  1948                                  ABSOLUTE bss_start
  1949                                  
  1950                                  alignb 2
  1951                                  
  1952                                  ;=============================================================================
  1953                                  ;        	uninitialized data
  1954                                  ;=============================================================================
  1955                                  
  1956                                  ; SB.ASM
  1957 00000F5C <res 00000001>          DmaFlag		resb	1		
  1958                                  
  1959                                  ; 11/03/2017
  1960 00000F5D <res 00000001>          iStatus:	resb	1
  1961                                    
  1962                                  ; MODLOAD.ASM
  1963 00000F5E <res 00000004>          FileHandle:	resd	1
  1964 00000F62 <res 0000043C>          Header:		resb	ModHeader.size
  1965                                  
  1966                                  ; MODPLAY.ASM
  1967                                  sampling_rate:	; 11/03/2017
  1968 0000139E <res 00000002>          MixSpeed:	resw 1
  1969                                  
  1970                                  ModInfo:
  1971 000013A0 <res 00000001>          ModInfo.OrderLen:   resb 1
  1972 000013A1 <res 00000001>          ModInfo.ReStart:    resb 1
  1973 000013A2 <res 00000080>          ModInfo.Order:	    resb 128
  1974 00001422 <res 00000004>          ModInfo.Patterns:   resd 1
  1975                                  
  1976 00001426 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1977 00001464 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1978 000014A2 <res 0000003E>          ModInfo.SampLen:    resw 31
  1979 000014E0 <res 0000003E>          ModInfo.SampRep:    resw 31
  1980 0000151E <res 0000003E>          ModInfo.SampRepLen: resw 31
  1981 0000155C <res 0000003E>          ModInfo.SampVol:    resw 31
  1982                                  
  1983                                  ; MODPLAY.ASM
  1984                                  PitchTable:	;resw 857
  1985 0000159A <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  1986 0000305C <res 00004100>          VolTable:	resb	16640
  1987 0000715C <res 00001000>          MixBuffer       resb	MixBufSize
  1988                                  
  1989                                  ; MODPLAY.ASM
  1990 0000815C <res 00000001>          OrderPos:	resb 1
  1991 0000815D <res 00000001>          Tempo:		resb 1
  1992 0000815E <res 00000001>          TempoWait:	resb 1
  1993 0000815F <res 00000001>          Bpm:		resb 1
  1994 00008160 <res 00000001>          Row:		resb 1
  1995 00008161 <res 00000001>          BreakRow:	resb 1
  1996 00008162 <res 00000002>          BpmSamples:	resw 1
  1997 00008164 <res 00000004>          BufPtr:		resd 1
  1998 00008168 <res 00000002>          BufLen:		resw 1
  1999 0000816A <res 00000004>          BufRep:		resd 1
  2000 0000816E <res 00000004>          Note:		resd 1
  2001 00008172 <res 00000098>          Tracks:		resb TrackInfo.size*NumTracks
  2002                                  
  2003 0000820A <res 00000006>          alignb 16
  2004                                  
  2005                                  ; PLAY.ASM
  2006 00008210 <res 00000280>          Scope:		resw	320
  2007 00008490 <res 00000200>          RowOfs:		resw	256
  2008                                  
  2009                                  ;03/03/2017
  2010 00008690 <res 00000004>          DMA_phy_buff:	resd 1
  2011                                  mod_file_name:
  2012 00008694 <res 00000010>          		resb 16
  2013                                  
  2014                                  ; 12/03/2017
  2015 000086A4 <res 0000795C>          alignb 65536
  2016                                  
  2017                                  DmaBuffer:
  2018 00010000 <res 00010000>          DoubleBuffer:	resb 65536 ; DmaBufSize
  2019                                  
  2020                                  alignb 65536
  2021                                  
  2022                                  file_buffer:
  2023 00020000 <res 00060000>          		resb 65536*6 ; 13/03/2017
  2024                                  EOF:
