     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: 22/04/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                                  
    19                                  ; 01/03/2017
    20                                  ; 16/10/2016
    21                                  ; 29/04/2016
    22                                  ; TRDOS 386 system calls (temporary list!)
    23                                  _ver 	equ 0
    24                                  _exit 	equ 1
    25                                  _fork 	equ 2
    26                                  _read 	equ 3
    27                                  _write	equ 4
    28                                  _open	equ 5
    29                                  _close 	equ 6
    30                                  _wait 	equ 7
    31                                  _creat 	equ 8
    32                                  _link 	equ 9
    33                                  _unlink	equ 10
    34                                  _exec	equ 11
    35                                  _chdir	equ 12
    36                                  _time 	equ 13
    37                                  _mkdir 	equ 14
    38                                  _chmod	equ 15
    39                                  _chown	equ 16
    40                                  _break	equ 17
    41                                  _stat	equ 18
    42                                  _seek	equ 19
    43                                  _tell 	equ 20
    44                                  _mount	equ 21
    45                                  _umount	equ 22
    46                                  _setuid	equ 23
    47                                  _getuid	equ 24
    48                                  _stime	equ 25
    49                                  _quit	equ 26	
    50                                  _intr	equ 27
    51                                  _fstat	equ 28
    52                                  _emt 	equ 29
    53                                  _mdate 	equ 30
    54                                  _video 	equ 31
    55                                  _audio	equ 32
    56                                  _timer	equ 33
    57                                  _sleep	equ 34
    58                                  _msg    equ 35
    59                                  _geterr	equ 36
    60                                  _fpsave	equ 37
    61                                  _pri	equ 38
    62                                  _rele	equ 39
    63                                  _fff	equ 40
    64                                  _fnf	equ 41
    65                                  _alloc	equ 42
    66                                  _dalloc equ 43
    67                                  _calbac equ 44				
    68                                  
    69                                  %macro sys 1-4
    70                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    71                                      ; 03/09/2015	
    72                                      ; 13/04/2015
    73                                      ; Retro UNIX 386 v1 system call.		
    74                                      %if %0 >= 2   
    75                                          mov ebx, %2
    76                                          %if %0 >= 3    
    77                                              mov ecx, %3
    78                                              %if %0 = 4
    79                                                 mov edx, %4   
    80                                              %endif
    81                                          %endif
    82                                      %endif
    83                                      mov eax, %1
    84                                      ;int 30h
    85                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    86                                  %endmacro
    87                                  
    88                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    89                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    90                                  
    91                                  
    92                                  ; ----------------------------------------------------------------------------
    93                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
    94                                  ;		July 14th, 1993.
    95                                  
    96                                  ;=============================================================================
    97                                  ;               PLAY.ASM
    98                                  ;=============================================================================
    99                                  
   100                                  [BITS 32]
   101                                  [org 0]
   102                                  
   103                                  Start:
   104                                  		; clear bss
   105 00000000 B9[00000800]            		mov	ecx, EOF
   106 00000005 BF[9E0E0000]            		mov	edi, bss_start
   107 0000000A 29F9                    		sub	ecx, edi
   108 0000000C D1E9                    		shr	ecx, 1
   109 0000000E 31C0                    		xor	eax, eax
   110 00000010 F366AB                  		rep	stosw
   111                                  
   112                                  GetFileName:  
   113 00000013 89E6                    		mov	esi, esp
   114 00000015 AD                      		lodsd
   115 00000016 83F802                  		cmp	eax, 2 ; two arguments 
   116                                  			       ; (program file name & mod file name)
   117 00000019 0F82A3010000            		jb	pmsg_usage ; nothing to do
   118                                  
   119 0000001F AD                      		lodsd ; program file name address 
   120 00000020 AD                      		lodsd ; mod file name address (file to be read)
   121 00000021 89C6                    		mov	esi, eax
   122 00000023 BF[C4710000]            		mov	edi, mod_file_name
   123                                  ScanName:       
   124 00000028 AC                      		lodsb
   125 00000029 84C0                    		test	al, al
   126 0000002B 0F8491010000            		je	pmsg_usage
   127 00000031 3C20                    		cmp	al, 20h
   128 00000033 74F3                    		je	short ScanName		; scan start of name.
   129 00000035 AA                      		stosb
   130 00000036 B4FF                    		mov	ah, 0FFh
   131                                  a_0:	
   132 00000038 FEC4                    		inc	ah
   133                                  a_1:
   134 0000003A AC                      		lodsb
   135 0000003B AA                      		stosb
   136 0000003C 3C2E                    		cmp	al, '.'
   137 0000003E 74F8                    		je	short a_0	
   138 00000040 20C0                    		and	al, al
   139 00000042 75F6                    		jnz	short a_1
   140                                  
   141 00000044 08E4                    		or	ah, ah			; if period NOT found,
   142 00000046 750B                    		jnz	short a_2		; then add a .MOD extension.
   143                                  SetExt:
   144 00000048 4F                      		dec	edi
   145 00000049 C7072E4D4F44            		mov	dword [edi], '.MOD'
   146 0000004F C6470400                		mov	byte [edi+4], 0
   147                                  a_2:
   148                                  		; Prints the Credits Text.
   149                                  		sys	_msg, Credits, 255, 0Ch
   149                              <1> 
   149                              <1> 
   149                              <1> 
   149                              <1> 
   149                              <1>  %if %0 >= 2
   149 00000053 BB[6F0D0000]        <1>  mov ebx, %2
   149                              <1>  %if %0 >= 3
   149 00000058 B9FF000000          <1>  mov ecx, %3
   149                              <1>  %if %0 = 4
   149 0000005D BA0C000000          <1>  mov edx, %4
   149                              <1>  %endif
   149                              <1>  %endif
   149                              <1>  %endif
   149 00000062 B823000000          <1>  mov eax, %1
   149                              <1> 
   149 00000067 CD40                <1>  int 40h
   150                                  
   151 00000069 E86C010000              		call    DetectSb		; Detect the SB Addr, Irq.
   152                                  LoadMod:  
   153 0000006E BF[C4710000]            		mov	edi, mod_file_name
   154 00000073 E8F6040000              		call    LoadModule		; Load the MODule...
   155                                  
   156 00000078 66833D[A40E0000]00      		cmp     word [ErrorInfo], 0	; any error loading?
   157 00000080 741B                    		je      short PlayNow
   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 00000082 BB[A30D0000]        <1>  mov ebx, %2
   161                              <1>  %if %0 >= 3
   161 00000087 B9FF000000          <1>  mov ecx, %3
   161                              <1>  %if %0 = 4
   161 0000008C BA0F000000          <1>  mov edx, %4
   161                              <1>  %endif
   161                              <1>  %endif
   161                              <1>  %endif
   161 00000091 B823000000          <1>  mov eax, %1
   161                              <1> 
   161 00000096 CD40                <1>  int 40h
   162                                  
   163 00000098 E919010000              		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 
   173                              <1> 
   173                              <1> 
   173                              <1> 
   173                              <1> 
   173                              <1>  %if %0 >= 2
   173 0000009D BB[00000100]        <1>  mov ebx, %2
   173                              <1>  %if %0 >= 3
   173 000000A2 B900000100          <1>  mov ecx, %3
   173                              <1>  %if %0 = 4
   173 000000A7 BA00000001          <1>  mov edx, %4
   173                              <1>  %endif
   173                              <1>  %endif
   173                              <1>  %endif
   173 000000AC B82A000000          <1>  mov eax, %1
   173                              <1> 
   173 000000B1 CD40                <1>  int 40h
   174 000000B3 724A                    		jc	short error_exit
   175                                  
   176 000000B5 A3[C0710000]            		mov	[DMA_phy_buff], eax	; physical address
   177                                  					     	; of the buffer
   178                                  						; (which is needed
   179                                  						; for DMA controller)
   180                                  
   181                                  		; 11/03/2017 (22000 -> 22050)
   182 000000BA 66C705[E2120000]22-     		mov     word [MixSpeed], 22050	; Mixing at 22 kHz
   182 000000C2 56                 
   183                                  
   184                                  ;		call    StartPlaying            ; PLAY!
   185                                  
   186 000000C3 E810030000              		call    SbInit
   187                                  
   188 000000C8 B980000000              		mov     ecx, 128		; Make a lookup table
   189 000000CD 31DB                    		xor     ebx, ebx		; for fastest pixel
   190 000000CF BA002D0000              		mov     edx, 320*(100-64)	; addressing.
   191                                  MakeOfs:        
   192 000000D4 668993[C06F0000]        		mov     [RowOfs+ebx], dx
   193 000000DB 668993[C26F0000]        		mov     [RowOfs+ebx+2], dx
   194 000000E2 6681C24001              		add     dx, 320
   195 000000E7 83C304                  		add     ebx, 4
   196 000000EA E2E8                    		loop    MakeOfs
   197                                  
   198                                  		;cld
   199                                  
   200                                  		; DIRECT VGA MEMORY ACCESS
   201                                  		; bl = 0, bh = 5
   202                                  		; Direct access/map to VGA memory (0A0000h)
   203                                  
   204                                  		sys	_video, 0500h
   204                              <1> 
   204                              <1> 
   204                              <1> 
   204                              <1> 
   204                              <1>  %if %0 >= 2
   204 000000EC BB00050000          <1>  mov ebx, %2
   204                              <1>  %if %0 >= 3
   204                              <1>  mov ecx, %3
   204                              <1>  %if %0 = 4
   204                              <1>  mov edx, %4
   204                              <1>  %endif
   204                              <1>  %endif
   204                              <1>  %endif
   204 000000F1 B81F000000          <1>  mov eax, %1
   204                              <1> 
   204 000000F6 CD40                <1>  int 40h
   205 000000F8 3D00000A00              		cmp	eax, 0A0000h
   206 000000FD 741B                    		je	short start_scope
   207                                  
   208                                  error_exit:
   209                                  		sys	_msg, trdos386_err_msg, 255, 0Eh
   209                              <1> 
   209                              <1> 
   209                              <1> 
   209                              <1> 
   209                              <1>  %if %0 >= 2
   209 000000FF BB[160E0000]        <1>  mov ebx, %2
   209                              <1>  %if %0 >= 3
   209 00000104 B9FF000000          <1>  mov ecx, %3
   209                              <1>  %if %0 = 4
   209 00000109 BA0E000000          <1>  mov edx, %4
   209                              <1>  %endif
   209                              <1>  %endif
   209                              <1>  %endif
   209 0000010E B823000000          <1>  mov eax, %1
   209                              <1> 
   209 00000113 CD40                <1>  int 40h
   210                                  		;jmp	short Exit
   211 00000115 E99C000000              		jmp	Exit
   212                                  		 	
   213                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   214                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   215                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   216                                  ;       second, or the module will sound "looped".
   217                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   218                                  ;       the polling is called from my routine, and then the irq 0 must be
   219                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   220                                  ;       samples played by the Sound Blaster. Note that some samples are
   221                                  ;       discarded in the next code, just for fun!
   222                                  
   223                                  start_scope:
   224                                  		; mov	ax, 0A000h
   225                                  		; mov	es, ax
   226 0000011A 89C7                    		mov	edi, eax  ; 0A0000h
   227                                  
   228                                  		;mov	byte [tLoop], 1
   229                                  	
   230                                  		; 11/03/2017
   231 0000011C 66B81300                		mov     ax, 0013h		; Set Mode 320x200x256
   232 00000120 CD31                    		int     31h
   233                                  ScopeLoop:
   234                                  		; ModPlay Polling!
   235 00000122 E884020000              		call    SbPoll
   236                                  
   237                                  		;cmp	byte [tLoop], 1
   238                                  		;jb	short _StopPlay
   239                                  
   240                                  
   241 00000127 BE[00000100]            		mov     esi, DmaBuffer		; get current samples
   242                                  						; to be drawed ...
   243                                  		; 12/03/2017
   244                                  		; original tinyplay scope drawing code is for 1K buffer
   245                                  		; but now we have 32K buffer, following code is for that...
   246                                  GetDmaCount:
   247                                  		;in	al, 03h
   248 0000012C 66BA0300                		mov	dx, 03h
   249 00000130 B400                    		mov	ah, 0 ; inb
   250 00000132 CD34                    		int	34h	
   251 00000134 88C1                    		mov	cl, al	
   252                                  		;in	al, 03h
   253                                  		;mov	ah, 0 ; inb
   254 00000136 CD34                    		int	34h
   255 00000138 88C5                    		mov     ch, al
   256 0000013A 66BAFFFF                		mov	dx, 65535
   257 0000013E 6629CA                  		sub	dx, cx
   258                                  		; 15/03/2017
   259 00000141 6681EAA000              		sub	dx, 160
   260 00000146 6601D6                  		add	si, dx
   261                                  		;
   262 00000149 6631C9                  		xor     cx, cx			
   263 0000014C 6631D2                  		xor     dx, dx
   264                                  DrawLoop:       
   265 0000014F 6689D3                  		mov     bx, dx			; (save Index)
   266 00000152 66678BBF[406D]          		mov     di, [Scope+bx]		; get old SCOPE pixel address
   267                                  		;mov    byte [es:di], 0		; erase it!
   268 00000158 C60700                  		mov	byte [edi], 0
   269                                  		;lodsb				; get a sample (8-bit)
   270                                  		;mov	bl, al
   271                                  		;15/03/2017
   272 0000015B 8A1E                    		mov	bl, [esi]		; calc new pixel address...
   273 0000015D 6646                    		inc	si
   274 0000015F 30FF                    		xor     bh, bh
   275 00000161 66D1E3                  		shl     bx, 1
   276 00000164 66678BBF[C06F]          		mov     di, [RowOfs+bx]
   277 0000016A 6601CF                  		add     di, cx
   278 0000016D 6689D3                  		mov     bx, dx			; (restore Index)
   279 00000170 666789BF[406D]          		mov     [Scope+bx], di		; save new address...
   280                                  		;mov	byte [es:di], 10	; and DRAW.
   281 00000176 C6070A                  		mov	byte [edi], 10
   282 00000179 6683C202                		add     dx, 2			; the next pixel...
   283 0000017D 6641                    		inc     cx
   284 0000017F 6681F94001              		cmp     cx, 320			; 320 pixels drawed?
   285 00000184 72C9                    		jb      short DrawLoop
   286                                  CheckAnyKey:
   287 00000186 B401                    		mov     ah, 1			; any key pressed?
   288 00000188 CD32                    		int     32h			; no, Loop.
   289 0000018A 7496                    		jz	short ScopeLoop
   290                                  
   291 0000018C B400                    		mov     ah, 0			; flush key buffer...
   292 0000018E CD32                    		int     32h
   293                                  
   294 00000190 66B80300                		mov     ax, 0003h		; Set Text Mode 80x25x16
   295 00000194 CD31                    		int     31h
   296                                  
   297                                  		;call	StopPlaying		; STOP!
   298                                  
   299                                  		;mov	byte [tLoop], 0
   300                                  _StopPlay:
   301                                  		; 11/03/2017
   302 00000196 30C0                    		xor     al, al
   303                                  		; Stop 8 bit (autoinitialized) DMA process	
   304                                  		;out	0Ch, al
   305                                  		;retn
   306 00000198 66BA0C00                		mov	dx, 0Ch
   307 0000019C B401                    		mov	ah, 1 ;outb
   308 0000019E CD34                    		int	34h
   309                                  
   310 000001A0 E88B030000              		call	SbDone
   311                                  
   312                                  		; Deallocate DMA buffer (not necessary just before exit!)
   313                                  		sys	_dalloc, DoubleBuffer, 2*DmaBufSize
   313                              <1> 
   313                              <1> 
   313                              <1> 
   313                              <1> 
   313                              <1>  %if %0 >= 2
   313 000001A5 BB[00000100]        <1>  mov ebx, %2
   313                              <1>  %if %0 >= 3
   313 000001AA B900000200          <1>  mov ecx, %3
   313                              <1>  %if %0 = 4
   313                              <1>  mov edx, %4
   313                              <1>  %endif
   313                              <1>  %endif
   313                              <1>  %endif
   313 000001AF B82B000000          <1>  mov eax, %1
   313                              <1> 
   313 000001B4 CD40                <1>  int 40h
   314                                  		;jc	error_exit
   315                                  Exit:           
   316 000001B6 E851050000              		call    FreeModule              ; Free MODule core.
   317                                  
   318                                  		sys	_exit			; Bye!
   318                              <1> 
   318                              <1> 
   318                              <1> 
   318                              <1> 
   318                              <1>  %if %0 >= 2
   318                              <1>  mov ebx, %2
   318                              <1>  %if %0 >= 3
   318                              <1>  mov ecx, %3
   318                              <1>  %if %0 = 4
   318                              <1>  mov edx, %4
   318                              <1>  %endif
   318                              <1>  %endif
   318                              <1>  %endif
   318 000001BB B801000000          <1>  mov eax, %1
   318                              <1> 
   318 000001C0 CD40                <1>  int 40h
   319                                  
   320                                  pmsg_usage:
   321                                  		sys	_msg, msg_usage, 255, 0Ah
   321                              <1> 
   321                              <1> 
   321                              <1> 
   321                              <1> 
   321                              <1>  %if %0 >= 2
   321 000001C2 BB[0B0D0000]        <1>  mov ebx, %2
   321                              <1>  %if %0 >= 3
   321 000001C7 B9FF000000          <1>  mov ecx, %3
   321                              <1>  %if %0 = 4
   321 000001CC BA0A000000          <1>  mov edx, %4
   321                              <1>  %endif
   321                              <1>  %endif
   321                              <1>  %endif
   321 000001D1 B823000000          <1>  mov eax, %1
   321                              <1> 
   321 000001D6 CD40                <1>  int 40h
   322 000001D8 EBDC                    		jmp	short Exit
   323                                  
   324                                  DetectSb:
   325 000001DA 60                      		pushad
   326                                  ScanPort:
   327 000001DB 66BB1002                		mov     bx, 210h		; start scanning ports
   328                                  						; 210h, 220h, .. 260h
   329                                  ResetDSP:       
   330 000001DF 6689DA                  		mov     dx, bx			; try to reset the DSP.
   331 000001E2 6683C206                		add     dx, 06h
   332 000001E6 B001                    		mov	al, 1
   333                                  		;out	dx, al
   334 000001E8 B401                    		mov	ah, 1 ; outb
   335 000001EA CD34                    		int	34h
   336                                  
   337                                  		;in	al, dx
   338                                  		;in	al, dx
   339                                  		;in	al, dx
   340                                  		;in	al, dx
   341                                  
   342 000001EC B400                    		mov	ah, 0 ; inb
   343 000001EE CD34                    		int	34h
   344                                  		;mov	ah, 0 ; inb
   345 000001F0 CD34                    		int	34h
   346                                  
   347 000001F2 30C0                    		xor     al, al
   348                                  		;out	dx, al
   349 000001F4 B401                    		mov	ah, 1 ; outb
   350 000001F6 CD34                    		int	34h
   351                                  
   352 000001F8 6683C208                		add     dx, 08h
   353                                  		;mov	cx, 100
   354 000001FC 66B92000                		mov	cx, 32
   355 00000200 28E4                    		sub	ah, ah ; 0
   356                                  WaitID:
   357                                  		;in	al, dx
   358 00000202 CD34                    		int	34h  ;ah = 0 ; inb
   359 00000204 08C0                    		or      al, al
   360 00000206 7804                    		js      short GetID
   361 00000208 E2F8                    		loop    WaitID
   362 0000020A EB10                    		jmp     short NextPort
   363                                  GetID:          
   364 0000020C 6683EA04                		sub     dx, 04h
   365                                  		;in	al, dx
   366 00000210 CD34                    		int	34h  ;ah = 0 ; inb
   367 00000212 3CAA                    		cmp     al, 0AAh
   368 00000214 7416                    		je      short Found
   369 00000216 6683C204                		add     dx, 04h
   370 0000021A E2E6                    		loop    WaitID
   371                                  NextPort:
   372 0000021C 6683C310                		add     bx, 10h			; if not response,
   373 00000220 6681FB6002              		cmp     bx, 260h		; try the next port.
   374 00000225 76B8                    		jbe     short ResetDSP
   375 00000227 E934010000              		jmp     Fail
   376                                  Found:
   377 0000022C 66891D[080D0000]        		mov     [SbAddr], bx		; SB Port Address Found!
   378                                  ScanIRQ:
   379                                  SetIrqs:        ; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ
   380                                  		sys	_calbac, 102h, 2, SbIrq ; IRQ 2
   380                              <1> 
   380                              <1> 
   380                              <1> 
   380                              <1> 
   380                              <1>  %if %0 >= 2
   380 00000233 BB02010000          <1>  mov ebx, %2
   380                              <1>  %if %0 >= 3
   380 00000238 B902000000          <1>  mov ecx, %3
   380                              <1>  %if %0 = 4
   380 0000023D BA[0A0D0000]        <1>  mov edx, %4
   380                              <1>  %endif
   380                              <1>  %endif
   380                              <1>  %endif
   380 00000242 B82C000000          <1>  mov eax, %1
   380                              <1> 
   380 00000247 CD40                <1>  int 40h
   381                                  						; Signal Response Byte
   382                                  		;jc	short error_exit
   383                                  
   384                                  		sys	_calbac, 103h, 3, SbIrq ; IRQ 3
   384                              <1> 
   384                              <1> 
   384                              <1> 
   384                              <1> 
   384                              <1>  %if %0 >= 2
   384 00000249 BB03010000          <1>  mov ebx, %2
   384                              <1>  %if %0 >= 3
   384 0000024E B903000000          <1>  mov ecx, %3
   384                              <1>  %if %0 = 4
   384 00000253 BA[0A0D0000]        <1>  mov edx, %4
   384                              <1>  %endif
   384                              <1>  %endif
   384                              <1>  %endif
   384 00000258 B82C000000          <1>  mov eax, %1
   384                              <1> 
   384 0000025D CD40                <1>  int 40h
   385                                  						; Signal Response Byte 
   386                                  		;jc	short error_exit
   387                                  
   388                                  		sys	_calbac, 104h, 4, SbIrq ; IRQ 4
   388                              <1> 
   388                              <1> 
   388                              <1> 
   388                              <1> 
   388                              <1>  %if %0 >= 2
   388 0000025F BB04010000          <1>  mov ebx, %2
   388                              <1>  %if %0 >= 3
   388 00000264 B904000000          <1>  mov ecx, %3
   388                              <1>  %if %0 = 4
   388 00000269 BA[0A0D0000]        <1>  mov edx, %4
   388                              <1>  %endif
   388                              <1>  %endif
   388                              <1>  %endif
   388 0000026E B82C000000          <1>  mov eax, %1
   388                              <1> 
   388 00000273 CD40                <1>  int 40h
   389                                  						; Signal Response Byte 
   390                                  		;jc	short error_exit
   391                                  
   392                                  		sys	_calbac, 105h, 5, SbIrq ; IRQ 5
   392                              <1> 
   392                              <1> 
   392                              <1> 
   392                              <1> 
   392                              <1>  %if %0 >= 2
   392 00000275 BB05010000          <1>  mov ebx, %2
   392                              <1>  %if %0 >= 3
   392 0000027A B905000000          <1>  mov ecx, %3
   392                              <1>  %if %0 = 4
   392 0000027F BA[0A0D0000]        <1>  mov edx, %4
   392                              <1>  %endif
   392                              <1>  %endif
   392                              <1>  %endif
   392 00000284 B82C000000          <1>  mov eax, %1
   392                              <1> 
   392 00000289 CD40                <1>  int 40h
   393                                  						; Signal Response Byte 
   394                                  		;jc	short error_exit
   395                                  
   396                                  		sys	_calbac, 107h, 7, SbIrq ; IRQ 7
   396                              <1> 
   396                              <1> 
   396                              <1> 
   396                              <1> 
   396                              <1>  %if %0 >= 2
   396 0000028B BB07010000          <1>  mov ebx, %2
   396                              <1>  %if %0 >= 3
   396 00000290 B907000000          <1>  mov ecx, %3
   396                              <1>  %if %0 = 4
   396 00000295 BA[0A0D0000]        <1>  mov edx, %4
   396                              <1>  %endif
   396                              <1>  %endif
   396                              <1>  %endif
   396 0000029A B82C000000          <1>  mov eax, %1
   396                              <1> 
   396 0000029F CD40                <1>  int 40h
   397                                  						; Signal Response Byte 
   398                                  		;jc	short error_exit
   399                                  
   400 000002A1 C605[0A0D0000]00        		mov     byte [SbIrq], 0		; clear the IRQ level.
   401                                  
   402 000002A8 668B15[080D0000]        		mov     dx, [SbAddr]		; tells to the SB to
   403 000002AF 6683C20C                		add     dx, 0Ch			; generate a IRQ!
   404                                  WaitSb:         ;in	al, dx
   405 000002B3 B400                    		mov	ah, 0 ; inb
   406 000002B5 CD34                    		int	34h
   407 000002B7 08C0                    		or      al, al
   408 000002B9 78F8                    		js      short WaitSb
   409 000002BB B0F2                    		mov     al, 0F2h
   410                                  		;out	dx, al
   411 000002BD B401                    		mov	ah,1  ; outb
   412 000002BF CD34                    		int	34h		
   413                                  
   414 000002C1 31C9                    		xor     ecx, ecx		; wait until IRQ level
   415                                  WaitIRQ:        
   416 000002C3 803D[0A0D0000]00        		cmp     byte [SbIrq], 0		; is changed or timeout.
   417 000002CA 7506                    		jne     short IrqOk
   418 000002CC 6649                    		dec 	cx
   419 000002CE 75F3                    		jnz	short WaitIRQ
   420 000002D0 EB0F                    		jmp	short RestoreIrqs
   421                                  IrqOk:
   422 000002D2 668B15[080D0000]        		mov     dx, [SbAddr]
   423 000002D9 6683C20E                		add     dx, 0Eh
   424                                  		;in	al, dx			; SB acknowledge.
   425 000002DD B400                    		mov	ah, 0 ; inb
   426 000002DF CD34                    		int	34h
   427                                  		;mov	al, 20h
   428                                  		;;out	20h, al			; Hardware acknowledge.
   429                                  		;mov	ah,1  ; outb
   430                                  		;int	34h		
   431                                  
   432                                  RestoreIrqs:    ; UNLINK SIGNAL RESPONSE/RETURN BYTE FROM REQUESTED IRQ
   433                                  		sys	_calbac, 2		; unlink IRQ 2
   433                              <1> 
   433                              <1> 
   433                              <1> 
   433                              <1> 
   433                              <1>  %if %0 >= 2
   433 000002E1 BB02000000          <1>  mov ebx, %2
   433                              <1>  %if %0 >= 3
   433                              <1>  mov ecx, %3
   433                              <1>  %if %0 = 4
   433                              <1>  mov edx, %4
   433                              <1>  %endif
   433                              <1>  %endif
   433                              <1>  %endif
   433 000002E6 B82C000000          <1>  mov eax, %1
   433                              <1> 
   433 000002EB CD40                <1>  int 40h
   434                                  						; Signal Response Byte
   435                                  		sys	_calbac, 3		; unlink IRQ 3
   435                              <1> 
   435                              <1> 
   435                              <1> 
   435                              <1> 
   435                              <1>  %if %0 >= 2
   435 000002ED BB03000000          <1>  mov ebx, %2
   435                              <1>  %if %0 >= 3
   435                              <1>  mov ecx, %3
   435                              <1>  %if %0 = 4
   435                              <1>  mov edx, %4
   435                              <1>  %endif
   435                              <1>  %endif
   435                              <1>  %endif
   435 000002F2 B82C000000          <1>  mov eax, %1
   435                              <1> 
   435 000002F7 CD40                <1>  int 40h
   436                                  						; Signal Response Byte 
   437                                  		sys	_calbac, 4		; unlink IRQ 4
   437                              <1> 
   437                              <1> 
   437                              <1> 
   437                              <1> 
   437                              <1>  %if %0 >= 2
   437 000002F9 BB04000000          <1>  mov ebx, %2
   437                              <1>  %if %0 >= 3
   437                              <1>  mov ecx, %3
   437                              <1>  %if %0 = 4
   437                              <1>  mov edx, %4
   437                              <1>  %endif
   437                              <1>  %endif
   437                              <1>  %endif
   437 000002FE B82C000000          <1>  mov eax, %1
   437                              <1> 
   437 00000303 CD40                <1>  int 40h
   438                                  						; Signal Response Byte 
   439                                  		sys	_calbac, 5		; unlink IRQ 5
   439                              <1> 
   439                              <1> 
   439                              <1> 
   439                              <1> 
   439                              <1>  %if %0 >= 2
   439 00000305 BB05000000          <1>  mov ebx, %2
   439                              <1>  %if %0 >= 3
   439                              <1>  mov ecx, %3
   439                              <1>  %if %0 = 4
   439                              <1>  mov edx, %4
   439                              <1>  %endif
   439                              <1>  %endif
   439                              <1>  %endif
   439 0000030A B82C000000          <1>  mov eax, %1
   439                              <1> 
   439 0000030F CD40                <1>  int 40h
   440                                  						; Signal Response Byte
   441                                  		sys	_calbac, 7		; unlink IRQ 7
   441                              <1> 
   441                              <1> 
   441                              <1> 
   441                              <1> 
   441                              <1>  %if %0 >= 2
   441 00000311 BB07000000          <1>  mov ebx, %2
   441                              <1>  %if %0 >= 3
   441                              <1>  mov ecx, %3
   441                              <1>  %if %0 = 4
   441                              <1>  mov edx, %4
   441                              <1>  %endif
   441                              <1>  %endif
   441                              <1>  %endif
   441 00000316 B82C000000          <1>  mov eax, %1
   441                              <1> 
   441 0000031B CD40                <1>  int 40h
   442                                  						; Signal Response Byte 
   443                                  
   444 0000031D 803D[0A0D0000]00        		cmp     byte [SbIrq], 0		; IRQ level was changed?
   445 00000324 743A                    		je      short Fail		; no, fail.
   446                                  Success:        
   447 00000326 668B15[080D0000]        		mov     dx, [SbAddr]		; Print Sucessful message.
   448 0000032D 8A0D[0A0D0000]          		mov     cl, [SbIrq]
   449 00000333 C0EA04                  		shr     dl, 4
   450 00000336 80C230                  		add     dl, '0'
   451 00000339 8815[080E0000]          		mov     [PortText], dl
   452 0000033F 80C130                  		add     cl, '0'
   453 00000342 880D[110E0000]          		mov     [IrqText], cl
   454                                  
   455                                  		sys	_msg, MsgFound, 255, 0Fh
   455                              <1> 
   455                              <1> 
   455                              <1> 
   455                              <1> 
   455                              <1>  %if %0 >= 2
   455 00000348 BB[E80D0000]        <1>  mov ebx, %2
   455                              <1>  %if %0 >= 3
   455 0000034D B9FF000000          <1>  mov ecx, %3
   455                              <1>  %if %0 = 4
   455 00000352 BA0F000000          <1>  mov edx, %4
   455                              <1>  %endif
   455                              <1>  %endif
   455                              <1>  %endif
   455 00000357 B823000000          <1>  mov eax, %1
   455                              <1> 
   455 0000035C CD40                <1>  int 40h
   456                                  
   457 0000035E 61                      		popad				; Return to caller.
   458 0000035F C3                      		retn
   459                                  
   460                                  Fail:  
   461                                  		; Print Failed Message,
   462                                  		; and exit to MainProg.
   463                                  
   464                                  		sys	_msg, MsgNotFound, 255, 0Fh
   464                              <1> 
   464                              <1> 
   464                              <1> 
   464                              <1> 
   464                              <1>  %if %0 >= 2
   464 00000360 BB[C00D0000]        <1>  mov ebx, %2
   464                              <1>  %if %0 >= 3
   464 00000365 B9FF000000          <1>  mov ecx, %3
   464                              <1>  %if %0 = 4
   464 0000036A BA0F000000          <1>  mov edx, %4
   464                              <1>  %endif
   464                              <1>  %endif
   464                              <1>  %endif
   464 0000036F B823000000          <1>  mov eax, %1
   464                              <1> 
   464 00000374 CD40                <1>  int 40h
   465                                  
   466                                  		sys 	_exit
   466                              <1> 
   466                              <1> 
   466                              <1> 
   466                              <1> 
   466                              <1>  %if %0 >= 2
   466                              <1>  mov ebx, %2
   466                              <1>  %if %0 >= 3
   466                              <1>  mov ecx, %3
   466                              <1>  %if %0 = 4
   466                              <1>  mov edx, %4
   466                              <1>  %endif
   466                              <1>  %endif
   466                              <1>  %endif
   466 00000376 B801000000          <1>  mov eax, %1
   466                              <1> 
   466 0000037B CD40                <1>  int 40h
   467                                  here:
   468 0000037D EBFE                    		jmp	short here
   469                                  
   470                                  ;=============================================================================
   471                                  ;               SB.ASM
   472                                  ;=============================================================================
   473                                  
   474                                  ;  Sound Blaster DMA Driver v0.1b by Carlos Hasan.
   475                                  ;		July 24th, 1993.
   476                                  
   477                                  ; EQUATES
   478                                  
   479                                  DmaBufSize 	equ	65536 ; 12/03/2016
   480                                  
   481                                  ; MACROS
   482                                  
   483                                  %macro	SbOut	1
   484                                  %%Wait:
   485                                  	;in	al, dx
   486                                  	mov	ah, 0
   487                                  	int	34h
   488                                  	or	al, al
   489                                  	js	short %%Wait
   490                                  	mov	al, %1
   491                                  	;out	dx, al
   492                                  	mov	ah, 1
   493                                  	int	34h
   494                                  %endmacro
   495                                  
   496                                  ; CODE
   497                                  
   498                                  ;--------------------------------------------------------------------------
   499                                  ; SbIrqHandler:  Sound Blaster IRQ handler.
   500                                  ;--------------------------------------------------------------------------
   501                                  
   502                                  SbIrqHandler:	; SoundBlaster IRQ Callback service for TRDOS 386
   503                                  		; 03/03/2017
   504                                  
   505                                  		; 12/03/2017
   506                                  		; 11/03/2017
   507                                  
   508 0000037F 668B15[080D0000]        		mov     dx, [SbAddr]
   509 00000386 6683C20E                		add     dx, 0Eh
   510                                  		;in	al, dx
   511                                  		;mov	ah, 0
   512 0000038A 28E4                    		sub	ah, ah
   513 0000038C CD34                    		int	34h
   514                                  
   515                                  		;test	byte [flags], ENDOFFILE	; end of file flag
   516                                  		;jz	short a_3
   517                                  
   518                                  		;sub     dx, 02h ; 0Ch
   519                                  
   520                                  		; exit auto-initialize 8 bit transfer
   521                                  		;SbOut	0DAh ; exit auto-initialize transfer command
   522                                  		;jmp	short a_5
   523                                  
   524                                  a_3:
   525 0000038E 30C0                    		xor	al, al ; 0
   526 00000390 A2[9F0E0000]            		mov	[iStatus], al
   527 00000395 3805[9E0E0000]          		cmp 	[DmaFlag], al
   528 0000039B 7702                    		ja	short a_4
   529 0000039D FEC0                    		inc	al
   530                                  a_4:
   531 0000039F A2[9E0E0000]            		mov 	[DmaFlag], al ; 
   532                                  a_5:
   533                                  		sys	_rele ; return from callback service
   533                              <1> 
   533                              <1> 
   533                              <1> 
   533                              <1> 
   533                              <1>  %if %0 >= 2
   533                              <1>  mov ebx, %2
   533                              <1>  %if %0 >= 3
   533                              <1>  mov ecx, %3
   533                              <1>  %if %0 = 4
   533                              <1>  mov edx, %4
   533                              <1>  %endif
   533                              <1>  %endif
   533                              <1>  %endif
   533 000003A4 B827000000          <1>  mov eax, %1
   533                              <1> 
   533 000003A9 CD40                <1>  int 40h
   534                                  
   535                                  ;--------------------------------------------------------------------------
   536                                  ; SbPoll:  Sound Blaster Polling.
   537                                  ;--------------------------------------------------------------------------
   538                                  
   539                                  SbPoll:
   540 000003AB 60                      		pushad
   541                                  		
   542                                  		; 11/03/2017
   543 000003AC 803D[9F0E0000]00        		cmp	byte [iStatus], 0
   544 000003B3 7721                    		ja	short Bye
   545                                  	
   546 000003B5 C605[9F0E0000]01        		mov	byte [iStatus], 1 ; 1 = set before interrupt
   547                                  			     ; (for preventing data load
   548                                  			     ; without an interrupt)	
   549                                  
   550                                  		;test	byte [flags], ENDOFFILE
   551                                  		;jnz	short sbPoll_stop
   552                                  
   553 000003BC BF[00000100]            		mov     edi, DmaBuffer
   554 000003C1 BB00800000              		mov     ebx, DmaBufSize/2
   555                                  
   556 000003C6 F605[9E0E0000]01        		test	byte [DmaFlag], 1
   557 000003CD 7402                    		jz	short FirstHalf
   558                                  SecondHalf:
   559 000003CF 01DF                    		add     edi, ebx
   560                                  FirstHalf:
   561 000003D1 E80F080000              		call    GetSamples
   562                                  Bye:
   563 000003D6 61                      		popad
   564 000003D7 C3                      		retn
   565                                  
   566                                  ;sbPoll_stop:	; 11/03/2017
   567                                  ;		; exit auto-initialize 8 bit transfer
   568                                  ;		SbOut	0DAh ; exit auto-initialize transfer command
   569                                  ;		;mov	byte [tLoop}, 0
   570                                  ;		jmp	short Bye
   571                                  
   572                                  ;--------------------------------------------------------------------------
   573                                  ; SbInit: Initializes the Sound Blaster Driver.
   574                                  ;--------------------------------------------------------------------------
   575                                  
   576                                  SbInit:
   577 000003D8 60                      		pushad
   578                                  
   579 000003D9 E884080000              		call    StartPlaying
   580                                  SetBuffer:
   581                                  		;mov	byte [DmaFlag], 0
   582 000003DE 8B1D[C0710000]          		mov	ebx, [DMA_phy_buff] ; physical addr of DMA buff
   583 000003E4 B900000100              		mov     ecx, DmaBufSize
   584 000003E9 49                      		dec     ecx
   585                                  
   586                                  		; 8 bit DMA buffer setting (DMA channel 1)
   587 000003EA B005                    		mov     al, 05h ; set mask bit for channel 1  (4+1)
   588                                  		;out	0Ah, al
   589 000003EC 66BA0A00                		mov	dx, 0Ah ; DMA mask register
   590 000003F0 B401                    		mov	ah, 1  ;outb
   591 000003F2 CD34                    		int	34h
   592                                  
   593 000003F4 30C0                    		xor     al, al ; stops all DMA processes on selected channel
   594                                  		;out	0Ch, al
   595 000003F6 B20C                    		mov	dl, 0Ch  ; clear selected channel register
   596                                  		;mov	ah, 1  ;outb
   597 000003F8 CD34                    		int	34h
   598                                  
   599 000003FA 88D8                    		mov     al, bl	; byte 0 of DMA buffer address (physical)   
   600                                  		;out	02h, al
   601 000003FC B202                    		mov	dl, 02h	; DMA channel 1 port number
   602                                  		;mov	ah, 1  ;outb
   603 000003FE CD34                    		int	34h
   604                                  
   605 00000400 88F8                    		mov     al, bh  ; byte 1 of DMA buffer address (physical)   
   606                                  		;out	02h, al
   607                                  		;mov	dl, 02h ; DMA channel 1 port number
   608                                  		;mov	ah, 1  ;outb
   609 00000402 CD34                    		int	34h
   610                                  
   611 00000404 C1EB10                  		shr	ebx, 16
   612                                  
   613 00000407 88D8                    		mov     al, bl ; byte 2 of DMA buffer address (physical)   
   614                                  		;out	83h, al
   615 00000409 B283                    		mov	dl, 83h ; page register port addr for channel 1
   616                                  		;mov	ah, 1  ;outb
   617 0000040B CD34                    		int	34h
   618                                  
   619 0000040D 88C8                    		mov     al, cl ; low byte of DMA count - 1
   620                                  		;out	03h, al
   621 0000040F B203                    		mov	dl, 03h ; count register port addr for channel 1
   622                                  		;mov	ah, 1  ;outb
   623 00000411 CD34                    		int	34h
   624                                  
   625 00000413 88E8                    		mov     al, ch ; high byte of DMA count - 1
   626                                  		;out	03h, al
   627                                  		;mov	dl, 03h ; count register port addr for channel 1
   628                                  		;mov	ah, 1  ;outb
   629 00000415 CD34                    		int	34h
   630                                  
   631                                  		; channel 1, read, autoinitialized, single mode
   632 00000417 B049                    		mov     al, 49h 
   633                                  		;out	0Bh, al
   634 00000419 B20B                    		mov	dl, 0Bh ; DMA mode register port address
   635                                  		;mov	ah, 1  ;outb
   636 0000041B CD34                    		int	34h
   637                                  
   638 0000041D B001                    		mov     al, 01h ; clear mask bit for channel 1
   639                                  		;out	0Ah, al
   640 0000041F B20A                    		mov	dl, 0Ah ; DMA mask register port address
   641                                  		;mov	ah, 1  ;outb
   642 00000421 CD34                    		int	34h
   643                                  ClearBuffer:
   644 00000423 BF[00000100]            		mov     edi, DmaBuffer	; virtual addr of DMA buff
   645                                  		;mov	ecx, DmaBufSize
   646 00000428 41                      		inc	ecx
   647 00000429 B080                    		mov     al, 80h
   648                                  		;cld
   649 0000042B F3AA                    		rep     stosb
   650                                  SetIrq:
   651                                  		; CALLBACK method
   652 0000042D 8A1D[0A0D0000]          		mov	bl, [SbIrq] ; IRQ number
   653 00000433 B702                    		mov	bh, 2 ; Link IRQ to user for callback service
   654 00000435 BA[7F030000]            		mov	edx, SbIrqHandler
   655                                  		sys	_calbac 
   655                              <1> 
   655                              <1> 
   655                              <1> 
   655                              <1> 
   655                              <1>  %if %0 >= 2
   655                              <1>  mov ebx, %2
   655                              <1>  %if %0 >= 3
   655                              <1>  mov ecx, %3
   655                              <1>  %if %0 = 4
   655                              <1>  mov edx, %4
   655                              <1>  %endif
   655                              <1>  %endif
   655                              <1>  %endif
   655 0000043A B82C000000          <1>  mov eax, %1
   655                              <1> 
   655 0000043F CD40                <1>  int 40h
   656                                  		; SIGNAL RESPONSE BYTE method ; 04/03/2017
   657                                  		;mov	bl, [SbIrq]
   658                                  		;mov	bh, 1 ; Signal Response Byte method
   659                                  		;movzx	ecx, bl ; S.R.B. value = IRQ Number 
   660                                  		;mov	edx, SbSrb ; S.R.B. address
   661                                  		;sys	_calbac
   662                                  ResetDsp:
   663 00000441 668B15[080D0000]        		mov     dx, [SbAddr]
   664 00000448 6683C206                		add     dx, 06h
   665 0000044C B001                    		mov     al, 1
   666                                  		;out	dx, al
   667 0000044E B401                    		mov	ah, 1  ;outb
   668 00000450 CD34                    		int	34h
   669                                  
   670                                  		;in	al, dx
   671                                  		;in	al, dx
   672                                  		;in	al, dx
   673                                  		;in	al, dx
   674                                  
   675 00000452 FECC                    		dec	ah ; ah = 0 ; inb
   676 00000454 CD34                    		int	34h		
   677                                  		;mov	ah, 0
   678 00000456 CD34                    		int	34h
   679                                  
   680 00000458 30C0                    		xor     al, al
   681                                  		;out	dx, al
   682 0000045A FEC4                    		inc	ah ; ah = 1 ;outb
   683 0000045C CD34                    		int	34h
   684                                  
   685 0000045E 66B96400                		mov     cx, 100
   686 00000462 28E4                    		sub	ah, ah ; 0
   687                                  WaitId:         
   688 00000464 668B15[080D0000]        		mov     dx, [SbAddr]
   689 0000046B 6683C20E                		add     dx, 0Eh
   690                                  		;in	al, dx
   691                                  		;mov	ah, 0  ;inb
   692 0000046F CD34                    		int	34h
   693 00000471 08C0                    		or      al, al
   694 00000473 7807                    		js      short sb_GetId
   695 00000475 E2ED                    		loop    WaitId
   696 00000477 E9B2000000              		jmp     sb_Exit
   697                                  sb_GetId:          
   698 0000047C 668B15[080D0000]        		mov     dx, [SbAddr]
   699 00000483 6683C20A                		add     dx, 0Ah
   700                                  		;in	al, dx
   701                                  		;mov	ah, 0  ;inb
   702 00000487 CD34                    		int	34h
   703 00000489 3CAA                    		cmp     al, 0AAh
   704 0000048B 7407                    		je      short SbOk
   705 0000048D E2D5                    		loop    WaitId
   706 0000048F E99A000000              		jmp	sb_Exit
   707                                  SbOk:
   708 00000494 668B15[080D0000]        		mov     dx, [SbAddr]
   709 0000049B 6683C20C                		add     dx, 0Ch
   710                                  		SbOut   0D1h
   710                              <1> %%Wait:
   710                              <1> 
   710 0000049F B400                <1>  mov ah, 0
   710 000004A1 CD34                <1>  int 34h
   710 000004A3 08C0                <1>  or al, al
   710 000004A5 78F8                <1>  js short %%Wait
   710 000004A7 B0D1                <1>  mov al, %1
   710                              <1> 
   710 000004A9 B401                <1>  mov ah, 1
   710 000004AB CD34                <1>  int 34h
   711                                  		
   712                                  		; 11/03/2017
   713                                  		SbOut   41h ; 8 bit or 16 bit transfer
   713                              <1> %%Wait:
   713                              <1> 
   713 000004AD B400                <1>  mov ah, 0
   713 000004AF CD34                <1>  int 34h
   713 000004B1 08C0                <1>  or al, al
   713 000004B3 78F8                <1>  js short %%Wait
   713 000004B5 B041                <1>  mov al, %1
   713                              <1> 
   713 000004B7 B401                <1>  mov ah, 1
   713 000004B9 CD34                <1>  int 34h
   714 000004BB 668B1D[E2120000]        		mov	bx, [sampling_rate]
   715                                  		SbOut	bh ; sampling rate high byte
   715                              <1> %%Wait:
   715                              <1> 
   715 000004C2 B400                <1>  mov ah, 0
   715 000004C4 CD34                <1>  int 34h
   715 000004C6 08C0                <1>  or al, al
   715 000004C8 78F8                <1>  js short %%Wait
   715 000004CA 88F8                <1>  mov al, %1
   715                              <1> 
   715 000004CC B401                <1>  mov ah, 1
   715 000004CE CD34                <1>  int 34h
   716                                  		SbOut	bl ; sampling rate low byte
   716                              <1> %%Wait:
   716                              <1> 
   716 000004D0 B400                <1>  mov ah, 0
   716 000004D2 CD34                <1>  int 34h
   716 000004D4 08C0                <1>  or al, al
   716 000004D6 78F8                <1>  js short %%Wait
   716 000004D8 88D8                <1>  mov al, %1
   716                              <1> 
   716 000004DA B401                <1>  mov ah, 1
   716 000004DC CD34                <1>  int 34h
   717                                  		
   718                                  		; 22/04/2017
   719                                  		;mov	ah, 1
   720                                  		;mov	dx, [SbAddr]
   721                                  		;add	dx, 4 ; Mixer chip address port
   722 000004DE 6683EA08                		sub	dx, 0Ch-04h
   723 000004E2 B022                    		mov	al, 22h ; master volume
   724 000004E4 CD34                    		int	34h
   725 000004E6 6642                    		inc	dx
   726 000004E8 B0FF                    		mov	al, 0FFh ; maximum volume level
   727 000004EA CD34                    		int	34h
   728 000004EC 6683C207                		add	dx, 0Ch-05h
   729                                  StartDma:  
   730                                  		; autoinitialized 8 bit DMA transfer mode
   731                                  		;mov	bx, 0C6h ; 8 bit output (0C6h)
   732                                  		; PCM output (8 bit mono autoinitialized transfer)
   733                                  		;SbOut  bl ; bCommand
   734                                  		;SbOut	bh ; bMode
   735                                  		SbOut	0C6h ; bCommand (C6h = 8 bit autoinitialzed)
   735                              <1> %%Wait:
   735                              <1> 
   735 000004F0 B400                <1>  mov ah, 0
   735 000004F2 CD34                <1>  int 34h
   735 000004F4 08C0                <1>  or al, al
   735 000004F6 78F8                <1>  js short %%Wait
   735 000004F8 B0C6                <1>  mov al, %1
   735                              <1> 
   735 000004FA B401                <1>  mov ah, 1
   735 000004FC CD34                <1>  int 34h
   736                                  		SbOut	0    ; bMode (0 = 8 bit mono)	
   736                              <1> %%Wait:
   736                              <1> 
   736 000004FE B400                <1>  mov ah, 0
   736 00000500 CD34                <1>  int 34h
   736 00000502 08C0                <1>  or al, al
   736 00000504 78F8                <1>  js short %%Wait
   736 00000506 B000                <1>  mov al, %1
   736                              <1> 
   736 00000508 B401                <1>  mov ah, 1
   736 0000050A CD34                <1>  int 34h
   737 0000050C 66BB0080                		mov	bx, DmaBufSize / 2
   738 00000510 664B                    		dec	bx  ; wBlkSize is one less than the actual size 
   739                                  		SbOut   bl
   739                              <1> %%Wait:
   739                              <1> 
   739 00000512 B400                <1>  mov ah, 0
   739 00000514 CD34                <1>  int 34h
   739 00000516 08C0                <1>  or al, al
   739 00000518 78F8                <1>  js short %%Wait
   739 0000051A 88D8                <1>  mov al, %1
   739                              <1> 
   739 0000051C B401                <1>  mov ah, 1
   739 0000051E CD34                <1>  int 34h
   740                                  		SbOut   bh
   740                              <1> %%Wait:
   740                              <1> 
   740 00000520 B400                <1>  mov ah, 0
   740 00000522 CD34                <1>  int 34h
   740 00000524 08C0                <1>  or al, al
   740 00000526 78F8                <1>  js short %%Wait
   740 00000528 88F8                <1>  mov al, %1
   740                              <1> 
   740 0000052A B401                <1>  mov ah, 1
   740 0000052C CD34                <1>  int 34h
   741                                  sb_Exit:           
   742 0000052E 61                      		popad
   743 0000052F C3                      		retn
   744                                  
   745                                  ;--------------------------------------------------------------------------
   746                                  ; SbDone:  Shut Down the Sound Blaster Driver.
   747                                  ;--------------------------------------------------------------------------
   748                                  
   749                                  SbDone:
   750 00000530 60                      		pushad
   751                                  
   752 00000531 8A1D[0A0D0000]          		mov     bl, [SbIrq] ; IRQ number
   753 00000537 28FF                    		sub	bh, bh ; 0 = Unlink IRQ from user
   754                                  		sys	_calbac 
   754                              <1> 
   754                              <1> 
   754                              <1> 
   754                              <1> 
   754                              <1>  %if %0 >= 2
   754                              <1>  mov ebx, %2
   754                              <1>  %if %0 >= 3
   754                              <1>  mov ecx, %3
   754                              <1>  %if %0 = 4
   754                              <1>  mov edx, %4
   754                              <1>  %endif
   754                              <1>  %endif
   754                              <1>  %endif
   754 00000539 B82C000000          <1>  mov eax, %1
   754                              <1> 
   754 0000053E CD40                <1>  int 40h
   755                                  
   756 00000540 668B15[080D0000]        		mov     dx, [SbAddr]
   757 00000547 6683C20C                		add     dx, 0Ch
   758                                  		SbOut   0D0h
   758                              <1> %%Wait:
   758                              <1> 
   758 0000054B B400                <1>  mov ah, 0
   758 0000054D CD34                <1>  int 34h
   758 0000054F 08C0                <1>  or al, al
   758 00000551 78F8                <1>  js short %%Wait
   758 00000553 B0D0                <1>  mov al, %1
   758                              <1> 
   758 00000555 B401                <1>  mov ah, 1
   758 00000557 CD34                <1>  int 34h
   759                                  		SbOut   0D3h
   759                              <1> %%Wait:
   759                              <1> 
   759 00000559 B400                <1>  mov ah, 0
   759 0000055B CD34                <1>  int 34h
   759 0000055D 08C0                <1>  or al, al
   759 0000055F 78F8                <1>  js short %%Wait
   759 00000561 B0D3                <1>  mov al, %1
   759                              <1> 
   759 00000563 B401                <1>  mov ah, 1
   759 00000565 CD34                <1>  int 34h
   760                                  
   761 00000567 E89B070000              		call    StopPlaying
   762                                  
   763 0000056C 61                      		popad
   764 0000056D C3                      		retn
   765                                  
   766                                  ;=============================================================================
   767                                  ;               MODLOAD.ASM
   768                                  ;=============================================================================
   769                                  
   770                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   771                                  ;		July 10th, 1993.
   772                                  
   773                                  ; STRUCTURES
   774                                  
   775                                  struc ModSample
   776 00000000 <res 00000016>          .msName:	resb 22
   777 00000016 <res 00000002>          .msLength:	resw 1
   778 00000018 <res 00000001>          .msFinetune:	resb 1
   779 00000019 <res 00000001>          .msVolume:	resb 1
   780 0000001A <res 00000002>          .msRepeat:	resw 1
   781 0000001C <res 00000002>          .msRepLen:	resw 1
   782                                  .size:
   783                                  endstruc
   784                                  
   785                                  struc ModHeader
   786 00000000 <res 00000014>          .mhName:	resb 20
   787 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   788 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   789 000003B7 <res 00000001>          .mhReStart:	resb 1
   790 000003B8 <res 00000080>          .mhOrder:	resb 128
   791 00000438 <res 00000004>          .mhSign:	resw 2
   792                                  .size:	
   793                                  endstruc
   794                                  
   795                                  struc ModInfoRec
   796 00000000 <res 00000001>          .OrderLen:	resb 1
   797 00000001 <res 00000001>          .ReStart:	resb 1
   798 00000002 <res 00000080>          .Order:		resb 128
   799 00000082 <res 00000004>          .Patterns:	resd 1
   800 00000086 <res 0000003E>          .SampOfs:	resw 31
   801 000000C4 <res 0000003E>          .SampSeg:	resw 31
   802 00000102 <res 0000003E>          .SampLen:	resw 31
   803 00000140 <res 0000003E>          .SampRep:	resw 31
   804 0000017E <res 0000003E>          .SampRepLen:	resw 31
   805 000001BC <res 0000003E>          .SampVol:	resw 31
   806                                  .size:	
   807                                  endstruc
   808                                  
   809                                  ; CODE
   810                                  
   811                                  LoadModule:
   812                                  		; edi = file name address
   813                                  
   814 0000056E 60                      		pushad
   815                                  
   816 0000056F 66C705[A40E0000]01-     		mov	word [ErrorInfo], 1
   816 00000577 00                 
   817                                  
   818 00000578 E88F010000              		call    ClearModInfo
   819                                  OpenFile:       
   820                                  		; ebx = ASCIIZ file name address
   821                                  		; ecx = open mode (0 = open for read)		
   822                                  		sys	_open, edi, 0 ; open for reading
   822                              <1> 
   822                              <1> 
   822                              <1> 
   822                              <1> 
   822                              <1>  %if %0 >= 2
   822 0000057D 89FB                <1>  mov ebx, %2
   822                              <1>  %if %0 >= 3
   822 0000057F B900000000          <1>  mov ecx, %3
   822                              <1>  %if %0 = 4
   822                              <1>  mov edx, %4
   822                              <1>  %endif
   822                              <1>  %endif
   822                              <1>  %endif
   822 00000584 B805000000          <1>  mov eax, %1
   822                              <1> 
   822 00000589 CD40                <1>  int 40h
   823 0000058B 0F8279010000            		jc	Failed
   824 00000591 A3[A00E0000]            		mov     [FileHandle], eax
   825                                  ReadHeader:
   826                                  		; ebx = File handle
   827                                  		; ecx = Buffer address
   828                                  		; edx = Byte count
   829                                  		sys	_read, [FileHandle], Header, ModHeader.size
   829                              <1> 
   829                              <1> 
   829                              <1> 
   829                              <1> 
   829                              <1>  %if %0 >= 2
   829 00000596 8B1D[A00E0000]      <1>  mov ebx, %2
   829                              <1>  %if %0 >= 3
   829 0000059C B9[A60E0000]        <1>  mov ecx, %3
   829                              <1>  %if %0 = 4
   829 000005A1 BA3C040000          <1>  mov edx, %4
   829                              <1>  %endif
   829                              <1>  %endif
   829                              <1>  %endif
   829 000005A6 B803000000          <1>  mov eax, %1
   829                              <1> 
   829 000005AB CD40                <1>  int 40h
   830 000005AD 0F824A010000            		jc      CloseFile
   831                                  CheckMK:        
   832 000005B3 813D[DE120000]4D2E-     		cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   832 000005BB 4B2E               
   833 000005BD 7440                    		je      short IsModFile
   834                                  CheckFLT4:
   835 000005BF 813D[DE120000]464C-     		cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   835 000005C7 5434               
   836 000005C9 7434                    		je      short IsModFile
   837                                  Is15Inst:
   838 000005CB BE[7C100000]            		mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   839 000005D0 BF[5C120000]            		mov     edi, Header+ModHeader.mhOrderLen
   840                                  		;cld
   841                                  		;mov	ecx, 130
   842 000005D5 66B98200                		mov	cx, 130
   843 000005D9 F3A4                    		rep     movsb
   844 000005DB BF[7C100000]            		mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   845 000005E0 30C0                    		xor     al, al
   846 000005E2 66B9E001                		mov     cx, 16*ModSample.size
   847 000005E6 F3AA                    		rep     stosb
   848                                  SeekPatterns:   
   849                                  		; ebx = [FileHandle]
   850                                  		; ecx = offset
   851                                  		; edx = switch (0 = from beginning)
   852                                  		sys	_seek, [FileHandle], 600, 0
   852                              <1> 
   852                              <1> 
   852                              <1> 
   852                              <1> 
   852                              <1>  %if %0 >= 2
   852 000005E8 8B1D[A00E0000]      <1>  mov ebx, %2
   852                              <1>  %if %0 >= 3
   852 000005EE B958020000          <1>  mov ecx, %3
   852                              <1>  %if %0 = 4
   852 000005F3 BA00000000          <1>  mov edx, %4
   852                              <1>  %endif
   852                              <1>  %endif
   852                              <1>  %endif
   852 000005F8 B813000000          <1>  mov eax, %1
   852                              <1> 
   852 000005FD CD40                <1>  int 40h
   853                                  IsModFile:
   854 000005FF A0[5C120000]            		mov     al, [Header+ModHeader.mhOrderLen]
   855 00000604 A2[E4120000]            		mov     [ModInfo.OrderLen], al
   856                                  
   857 00000609 A0[5D120000]            		mov     al, [Header+ModHeader.mhReStart]
   858 0000060E 3A05[5C120000]          		cmp     al, [Header+ModHeader.mhOrderLen]
   859 00000614 7202                    		jb      short SetReStart
   860 00000616 B07F                    		mov     al, 7Fh
   861                                  SetReStart:
   862 00000618 A2[E5120000]            		mov     [ModInfo.ReStart], al
   863                                  
   864                                  		;mov	ecx, 128
   865 0000061D 66B98000                		mov	cx, 128
   866 00000621 31D2                    		xor     edx, edx
   867 00000623 31DB                    		xor     ebx, ebx
   868                                  CopyOrder:
   869 00000625 8AB3[5E120000]          		mov     dh, [Header+ModHeader.mhOrder+ebx]
   870 0000062B 88B3[E6120000]          		mov     [ModInfo.Order+ebx], dh
   871 00000631 38D6                    		cmp     dh, dl
   872 00000633 7202                    		jb      short NextOrder
   873 00000635 88F2                    		mov     dl, dh
   874                                  NextOrder:
   875 00000637 43                      		inc     ebx
   876 00000638 E2EB                    		loop    CopyOrder
   877                                  AllocPatterns:  
   878 0000063A 81E2FF000000            		and	edx, 0FFh
   879 00000640 6642                    		inc	dx  ; 12/03/2017
   880                                  		; dl = count of 1024 bytes
   881 00000642 C1E20A                  		shl	edx, 10 ; *1024
   882                                  
   883 00000645 89D5                    		mov	ebp, edx
   884                                  		;mov	ecx, 10000h ; next 64K (4096*16)
   885 00000647 B9[00000200]            		mov	ecx, file_buffer ; 12/03/2017
   886                                  		;
   887 0000064C 890D[66130000]          		mov	[ModInfo.Patterns], ecx
   888                                  		;
   889 00000652 01CD                    		add	ebp, ecx ; next offset for samples
   890                                  ReadPatterns:  
   891                                  		;mov	ebx, [FileHandle] 
   892                                  		; ebx = File handle
   893                                  		; ecx = Buffer address
   894                                  		; edx = Byte count
   895                                  		sys	_read, [FileHandle]
   895                              <1> 
   895                              <1> 
   895                              <1> 
   895                              <1> 
   895                              <1>  %if %0 >= 2
   895 00000654 8B1D[A00E0000]      <1>  mov ebx, %2
   895                              <1>  %if %0 >= 3
   895                              <1>  mov ecx, %3
   895                              <1>  %if %0 = 4
   895                              <1>  mov edx, %4
   895                              <1>  %endif
   895                              <1>  %endif
   895                              <1>  %endif
   895 0000065A B803000000          <1>  mov eax, %1
   895                              <1> 
   895 0000065F CD40                <1>  int 40h
   896 00000661 0F8296000000            		jc      CloseFile
   897                                  
   898 00000667 BE[BA0E0000]            		mov	esi, Header+ModHeader.mhSamples
   899 0000066C 31FF                    		xor     edi, edi
   900                                  CopySamples:
   901 0000066E 668B4616                		mov     ax, [esi+ModSample.msLength]
   902 00000672 86C4                    		xchg    al, ah
   903 00000674 66D1E0                  		shl     ax, 1
   904 00000677 668987[E6130000]        		mov     [ModInfo.SampLen+edi], ax
   905 0000067E 8A4619                  		mov     al, [esi+ModSample.msVolume]
   906 00000681 30E4                    		xor     ah, ah
   907 00000683 668987[A0140000]        		mov     [ModInfo.SampVol+edi], ax
   908 0000068A 668B461A                		mov     ax, [esi+ModSample.msRepeat]
   909 0000068E 86C4                    		xchg    al, ah
   910 00000690 66D1E0                  		shl     ax, 1
   911 00000693 668987[24140000]        		mov     [ModInfo.SampRep+edi], ax
   912 0000069A 668B461C                		mov     ax, [esi+ModSample.msRepLen]
   913 0000069E 86C4                    		xchg    al, ah
   914 000006A0 66D1E0                  		shl     ax, 1
   915 000006A3 668987[62140000]        		mov     [ModInfo.SampRepLen+edi], ax
   916 000006AA 83C61E                  		add     esi, ModSample.size
   917 000006AD 6683C702                		add     di, 2
   918 000006B1 6683FF3E                		cmp     di, 2*31
   919 000006B5 72B7                    		jb      short CopySamples
   920                                  
   921 000006B7 31F6                    		xor     esi, esi
   922                                  AllocSamples:
   923 000006B9 0FB796[E6130000]        		movzx	edx, word [ModInfo.SampLen+esi]
   924 000006C0 09D2                    		or	edx, edx ; byte count
   925 000006C2 7426                    		jz      short NextSample
   926 000006C4 89E8                    		mov	eax, ebp
   927 000006C6 668986[6A130000]        		mov	[ModInfo.SampOfs+esi], ax
   928 000006CD C1E810                  		shr	eax, 16
   929 000006D0 668986[A8130000]        		mov	[ModInfo.SampSeg+esi], ax
   930 000006D7 89E9                    		mov	ecx, ebp
   931 000006D9 01D5                    		add	ebp, edx ; next offset for sample 
   932                                  ReadSample:
   933                                  		;mov	ebx, [FileHandle]
   934                                  		;movzx  edx, [ModInfo.SampLen+esi]
   935                                  		;mov    ecx, [ModInfo.SampOfs+esi]
   936                                  
   937                                  		; ebx = File handle
   938                                  		; ecx = Buffer address
   939                                  		; edx = Byte count
   940                                  		sys	_read, [FileHandle]
   940                              <1> 
   940                              <1> 
   940                              <1> 
   940                              <1> 
   940                              <1>  %if %0 >= 2
   940 000006DB 8B1D[A00E0000]      <1>  mov ebx, %2
   940                              <1>  %if %0 >= 3
   940                              <1>  mov ecx, %3
   940                              <1>  %if %0 = 4
   940                              <1>  mov edx, %4
   940                              <1>  %endif
   940                              <1>  %endif
   940                              <1>  %endif
   940 000006E1 B803000000          <1>  mov eax, %1
   940                              <1> 
   940 000006E6 CD40                <1>  int 40h
   941 000006E8 7213                    		jc      short CloseFile
   942                                  
   943                                  NextSample:
   944 000006EA 6683C602                		add     si, 2
   945 000006EE 6683FE3E                		cmp     si, 2*31
   946 000006F2 72C5                    		jb      short AllocSamples
   947                                  
   948 000006F4 66C705[A40E0000]00-     		mov     word [ErrorInfo], 0
   948 000006FC 00                 
   949                                  CloseFile:      
   950                                  		sys	_close, [FileHandle]
   950                              <1> 
   950                              <1> 
   950                              <1> 
   950                              <1> 
   950                              <1>  %if %0 >= 2
   950 000006FD 8B1D[A00E0000]      <1>  mov ebx, %2
   950                              <1>  %if %0 >= 3
   950                              <1>  mov ecx, %3
   950                              <1>  %if %0 = 4
   950                              <1>  mov edx, %4
   950                              <1>  %endif
   950                              <1>  %endif
   950                              <1>  %endif
   950 00000703 B806000000          <1>  mov eax, %1
   950                              <1> 
   950 00000708 CD40                <1>  int 40h
   951                                  Failed:         
   952 0000070A 61                      		popad
   953                                  
   954 0000070B C3                      		retn
   955                                  
   956                                  FreeModule:
   957                                  		; Erdogan Tan (13/02/2017)
   958                                  		; nothing to do here for memory de-allocation
   959                                  ClearModInfo:
   960 0000070C 57                      		push	edi
   961 0000070D BF[E4120000]            		mov	edi, ModInfo
   962 00000712 B9FA010000              		mov     ecx, ModInfoRec.size
   963                                  		;cld
   964 00000717 30C0                    		xor     al, al
   965 00000719 F3AA                    		rep     stosb
   966 0000071B 5F                      		pop	edi
   967 0000071C C3                      		retn
   968                                  
   969                                  ;=============================================================================
   970                                  ;               MODPLAY.ASM
   971                                  ;=============================================================================
   972                                  
   973                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   974                                  ;		July 23th, 1993.
   975                                  
   976                                  ; EQUATES
   977                                  
   978                                  NumTracks       equ 4
   979                                  DefTempo        equ 6
   980                                  DefBpm          equ 125
   981                                  MidCRate        equ 8448
   982                                  MixBufSize      equ 4096
   983                                  
   984                                  ; STRUCTURES
   985                                  
   986                                  struc TrackInfo
   987 00000000 <res 00000004>          .Samples:	resd 1
   988 00000004 <res 00000004>          .Position:	resd 1
   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
   993 0000000F <res 00000001>          .Error:		resb 1
   994 00000010 <res 00000002>          .Period:	resw 1
   995 00000012 <res 00000002>          .Pitch:		resw 1
   996 00000014 <res 00000002>          .Effect:	resw 1
   997 00000016 <res 00000002>          .PortTo:	resw 1
   998 00000018 <res 00000001>          .PortParm:	resb 1
   999 00000019 <res 00000001>          .VibPos:	resb 1
  1000 0000001A <res 00000001>          .VibParm:	resb 1
  1001 0000001B <res 00000001>          .OldSampOfs:	resb 1
  1002 0000001C <res 00000006>          .Arp:		resw 3
  1003 00000022 <res 00000002>          .ArpIndex:	resw 1
  1004                                  .size:
  1005                                  endstruc
  1006                                  
  1007                                  ; CODE
  1008                                  
  1009                                  ;--------------------------------------------------------------------------
  1010                                  ; BeatTrack:  Process the next beat in one track.
  1011                                  ;  In:
  1012                                  ;    ds:di -  Track info Address.
  1013                                  ;--------------------------------------------------------------------------
  1014                                  
  1015                                  ; edi = Track info address
  1016                                  
  1017                                  BeatTrack:
  1018 0000071D 668B5714                		mov     dx, [edi+TrackInfo.Effect]
  1019 00000721 6685D2                  		test    dx, dx
  1020 00000724 743C                    		je      short None
  1021 00000726 80FE00                  		cmp     dh, 00h
  1022 00000729 7438                    		je      short Arpeggio
  1023 0000072B 80FE01                  		cmp     dh, 01h
  1024 0000072E 7451                    		je      short PortUp
  1025 00000730 80FE02                  		cmp     dh, 02h
  1026 00000733 7471                    		je      short PortDown
  1027 00000735 80FE03                  		cmp     dh, 03h
  1028 00000738 0F848E000000            		je      TonePort
  1029 0000073E 80FE04                  		cmp     dh, 04h
  1030 00000741 0F84BD000000            		je      Vibrato
  1031 00000747 80FE05                  		cmp     dh, 05h
  1032 0000074A 0F840E010000            		je      PortSlide
  1033 00000750 80FE06                  		cmp     dh, 06h
  1034 00000753 0F8412010000            		je      VibSlide
  1035 00000759 80FE0A                  		cmp     dh, 0Ah
  1036 0000075C 0F8413010000            		je      VolSlide
  1037                                  None:           
  1038 00000762 C3                      		retn
  1039                                  Arpeggio:
  1040 00000763 0FB75F22                		movzx   ebx, word [edi+TrackInfo.ArpIndex]
  1041 00000767 668B441F1C              		mov     ax, [edi+TrackInfo.Arp+ebx]
  1042 0000076C 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1043 00000770 6683C302                		add     bx, 2
  1044 00000774 6683FB06                		cmp     bx, 6
  1045 00000778 7202                    		jb      short SetArpIndex
  1046 0000077A 31DB                    		xor     ebx, ebx
  1047                                  SetArpIndex:
  1048 0000077C 66895F22                		mov     [edi+TrackInfo.ArpIndex], bx
  1049 00000780 C3                      		retn
  1050                                  PortUp:
  1051 00000781 30F6                    		xor     dh, dh
  1052 00000783 668B5F10                		mov     bx, [edi+TrackInfo.Period]
  1053 00000787 6629D3                  		sub     bx, dx
  1054 0000078A 6683FB71                		cmp     bx, 113
  1055 0000078E 7D04                    		jge     short NotSmall
  1056 00000790 66BB7100                		mov     bx, 113
  1057                                  NotSmall:
  1058 00000794 66895F10                		mov     [edi+TrackInfo.Period], bx
  1059 00000798 6601DB                  		add     bx, bx
  1060 0000079B 66678B87[DE14]          		mov     ax, [PitchTable+bx]
  1061 000007A1 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1062 000007A5 C3                      		retn
  1063                                  PortDown:
  1064 000007A6 30F6                    		xor     dh, dh
  1065 000007A8 668B5F10                		mov     bx, [edi+TrackInfo.Period]
  1066 000007AC 6601D3                  		add     bx, dx
  1067 000007AF 6681FB5803              		cmp     bx, 856
  1068 000007B4 7E04                    		jle     short NotBig
  1069 000007B6 66BB5803                		mov     bx, 856
  1070 000007BA 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
  1071 000007BE 6601DB                  		add     bx, bx
  1072 000007C1 66678B87[DE14]          		mov     ax, [PitchTable+bx]
  1073 000007C7 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1074 000007CB C3                      		retn
  1075                                  TonePort:
  1076 000007CC 30F6                    		xor     dh, dh
  1077 000007CE 668B4716                		mov     ax, [edi+TrackInfo.PortTo]
  1078 000007D2 668B5F10                		mov     bx, [edi+TrackInfo.Period]
  1079 000007D6 6639C3                  		cmp     bx, ax
  1080 000007D9 7428                    		je      short NoPort
  1081 000007DB 7F0D                    		jg      short PortToUp
  1082                                  PortToDown:     
  1083 000007DD 6601D3                  		add     bx, dx
  1084 000007E0 6639C3                  		cmp     bx, ax
  1085 000007E3 7E0D                    		jle     short SetPort
  1086                                  FixPort:        
  1087 000007E5 6689C3                  		mov     bx, ax
  1088 000007E8 EB08                    		jmp     short SetPort
  1089                                  PortToUp:
  1090 000007EA 6629D3                  		sub     bx, dx
  1091 000007ED 6639C3                  		cmp     bx, ax
  1092 000007F0 7CF3                    		jl      short FixPort
  1093                                  SetPort:        
  1094 000007F2 66895F10                		mov     [edi+TrackInfo.Period], bx
  1095 000007F6 6601DB                  		add     bx, bx
  1096 000007F9 66678B87[DE14]          		mov     ax, [PitchTable+bx]
  1097 000007FF 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1098                                  NoPort:         
  1099 00000803 C3                      		retn
  1100                                  Vibrato:
  1101 00000804 88D6                    		mov     dh, dl
  1102 00000806 80E20F                  		and     dl, 0Fh
  1103 00000809 C0EE04                  		shr     dh, 4
  1104 0000080C C0E602                  		shl     dh, 2
  1105 0000080F 007719                  		add     [edi+TrackInfo.VibPos], dh
  1106 00000812 8A7719                  		mov     dh, [edi+TrackInfo.VibPos]
  1107 00000815 88F3                    		mov     bl, dh
  1108 00000817 C0EB02                  		shr     bl, 2
  1109 0000081A 6683E31F                		and     bx, 1Fh
  1110 0000081E 678A87[360E]            		mov     al, [SinTable+bx]
  1111 00000823 F6E2                    		mul     dl
  1112 00000825 66D1C0                  		rol     ax, 1
  1113 00000828 86C4                    		xchg    al, ah
  1114 0000082A 80E401                  		and     ah, 1
  1115 0000082D 84F6                    		test    dh, dh
  1116 0000082F 7903                    		jns     short VibUp
  1117 00000831 66F7D8                  		neg     ax
  1118                                  VibUp:          
  1119 00000834 66034710                		add     ax, [edi+TrackInfo.Period]
  1120 00000838 6689C3                  		mov     bx, ax
  1121 0000083B 6683FB71                		cmp     bx, 113
  1122 0000083F 7D04                    		jge     short NoLoVib
  1123 00000841 66BB7100                		mov     bx, 113
  1124                                  NoLoVib:        
  1125 00000845 6681FB5803              		cmp     bx, 856
  1126 0000084A 7E04                    		jle     short NoHiVib
  1127 0000084C 66BB5803                		mov     bx, 856
  1128                                  NoHiVib:        
  1129 00000850 6601DB                  		add     bx, bx
  1130 00000853 66678B87[DE14]          		mov     ax, [PitchTable+bx]
  1131 00000859 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1132 0000085D C3                      		retn
  1133                                  PortSlide:
  1134 0000085E E812000000              		call    VolSlide
  1135 00000863 8A5718                  		mov     dl, [edi+TrackInfo.PortParm]
  1136 00000866 E961FFFFFF              		jmp     TonePort
  1137                                  VibSlide:
  1138 0000086B E805000000              		call    VolSlide
  1139 00000870 8A571A                  		mov     dl, [edi+TrackInfo.VibParm]
  1140 00000873 EB8F                    		jmp     short Vibrato
  1141                                  VolSlide:
  1142 00000875 88D6                    		mov     dh, dl
  1143 00000877 80E20F                  		and     dl, 0Fh
  1144 0000087A C0EE04                  		shr     dh, 4
  1145 0000087D 8A470E                  		mov     al, [edi+TrackInfo.Volume]
  1146 00000880 28D0                    		sub     al, dl
  1147 00000882 7D02                    		jge     short NoLoVol
  1148 00000884 30C0                    		xor     al, al
  1149                                  NoLoVol:        
  1150 00000886 00F0                    		add     al, dh
  1151 00000888 3C40                    		cmp     al, 64
  1152 0000088A 7602                    		jbe     short NoHiVol
  1153 0000088C B040                    		mov     al, 64
  1154                                  NoHiVol:        
  1155 0000088E 88470E                  		mov     [edi+TrackInfo.Volume], al
  1156 00000891 C3                      		retn
  1157                                  
  1158                                  ;--------------------------------------------------------------------------
  1159                                  ; GetTrack:   Get the next Note from a pattern.
  1160                                  ;  In:
  1161                                  ;    ds:di -  Track info Address.
  1162                                  ;    es:si -  Pattern Note Address.
  1163                                  ; Out:
  1164                                  ;    es:si -  The Next Pattern Note address.
  1165                                  ;--------------------------------------------------------------------------
  1166                                  
  1167                                  ; esi = Pattern note address
  1168                                  ; edi = Track info address
  1169                                  
  1170                                  GetTrack:
  1171 00000892 66AD                    		lodsw
  1172 00000894 86C4                    		xchg    al, ah
  1173 00000896 88E3                    		mov	bl, ah
  1174 00000898 80E40F                  		and     ah, 0Fh
  1175 0000089B 6689C1                  		mov     cx, ax
  1176 0000089E 66AD                    		lodsw
  1177 000008A0 86C4                    		xchg    al, ah
  1178 000008A2 88E7                    		mov     bh, ah
  1179 000008A4 80E40F                  		and     ah, 0Fh
  1180 000008A7 6689C2                  		mov     dx, ax
  1181 000008AA 66895714                		mov     [edi+TrackInfo.Effect], dx
  1182 000008AE 80E3F0                  		and     bl, 0F0h
  1183 000008B1 C0EF04                  		shr     bh, 4
  1184 000008B4 08FB                    		or      bl, bh
  1185 000008B6 744A                    		je      short SetPeriod
  1186                                  SetSample:
  1187                                  		;xor    bh, bh
  1188 000008B8 81E3FF000000            		and	ebx, 0FFh
  1189 000008BE FECB                    		dec     bl
  1190 000008C0 01DB                    		add     ebx, ebx
  1191 000008C2 668B83[A0140000]        		mov     ax, [ModInfo.SampVol+ebx]
  1192 000008C9 88470E                  		mov     [edi+TrackInfo.Volume], al
  1193 000008CC 668B83[6A130000]        		mov     ax, [ModInfo.SampOfs+ebx]
  1194 000008D3 668907                  		mov     [edi+TrackInfo.Samples], ax
  1195 000008D6 668B83[A8130000]        		mov     ax, [ModInfo.SampSeg+ebx]
  1196 000008DD 66894702                		mov     [edi+TrackInfo.Samples+2], ax
  1197 000008E1 668B83[E6130000]        		mov     ax, [ModInfo.SampLen+ebx]
  1198 000008E8 66894708                		mov     [edi+TrackInfo.Len], ax
  1199 000008EC 668B83[24140000]        		mov     ax, [ModInfo.SampRep+ebx]
  1200 000008F3 6689470A                		mov     [edi+TrackInfo.Repeat], ax
  1201 000008F7 668B83[62140000]        		mov     ax, [ModInfo.SampRepLen+ebx]
  1202 000008FE 6689470C                		mov     [edi+TrackInfo.RepLen], ax
  1203                                  SetPeriod:      
  1204 00000902 6685C9                  		test    cx, cx
  1205 00000905 7424                    		jz      short SetEffect
  1206                                  
  1207 00000907 66894F16                		mov     [edi+TrackInfo.PortTo], cx
  1208 0000090B 80FE03                  		cmp     dh, 03h
  1209 0000090E 741B                    		je      short SetEffect
  1210                                  
  1211 00000910 66894F10                		mov     [edi+TrackInfo.Period], cx
  1212 00000914 6689CB                  		mov     bx, cx
  1213 00000917 6601DB                  		add     bx, bx
  1214 0000091A 66678B87[DE14]          		mov     ax, [PitchTable+bx]
  1215 00000920 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1216 00000924 C7470400000000          		mov     dword [edi+TrackInfo.Position], 0
  1217                                  SetEffect:
  1218 0000092B 6685D2                  		test    dx, dx
  1219 0000092E 7430                    		jz      short InitNone
  1220 00000930 80FE00                  		cmp     dh, 00h
  1221 00000933 0F84E5000000            		je      InitArpeggio
  1222 00000939 80FE03                  		cmp     dh, 03h
  1223 0000093C 7423                    		je      short InitTonePort
  1224 0000093E 80FE04                  		cmp     dh, 04h
  1225 00000941 742D                    		je      short InitVibrato
  1226 00000943 80FE09                  		cmp     dh, 09h
  1227 00000946 7451                    		je      short SampleOfs
  1228 00000948 80FE0B                  		cmp     dh, 0Bh
  1229 0000094B 7462                    		je      short PosJump
  1230 0000094D 80FE0C                  		cmp     dh, 0Ch
  1231 00000950 746B                    		je      short SetVolume
  1232 00000952 80FE0D                  		cmp     dh, 0Dh
  1233 00000955 7471                    		je      short Break
  1234 00000957 80FE0F                  		cmp     dh, 0Fh
  1235 0000095A 0F8487000000            		je      SetSpeed
  1236                                  InitNone:
  1237 00000960 C3                      		retn
  1238                                  InitTonePort:
  1239 00000961 84D2                    		test    dl, dl
  1240 00000963 7503                    		jnz     short SetPortParm
  1241 00000965 8A5718                  		mov     dl, [edi+TrackInfo.PortParm]
  1242                                  SetPortParm:    
  1243 00000968 885718                  		mov     [edi+TrackInfo.PortParm], dl
  1244 0000096B 66895714                		mov     [edi+TrackInfo.Effect], dx
  1245 0000096F C3                      		retn
  1246                                  InitVibrato:
  1247 00000970 8A471A                  		mov     al, [edi+TrackInfo.VibParm]
  1248 00000973 88C4                    		mov     ah, al
  1249 00000975 240F                    		and     al, 0Fh
  1250 00000977 80E4F0                  		and     ah, 0F0h
  1251 0000097A F6C20F                  		test    dl, 0Fh
  1252 0000097D 7502                    		jne     short OkDepth
  1253 0000097F 08C2                    		or      dl, al
  1254                                  OkDepth:        
  1255 00000981 F6C2F0                  		test    dl, 0F0h
  1256 00000984 7502                    		jnz     short OkRate
  1257 00000986 08E2                    		or      dl, ah
  1258                                  OkRate:         
  1259 00000988 88571A                  		mov     [edi+TrackInfo.VibParm], dl
  1260 0000098B 66895714                		mov     [edi+TrackInfo.Effect], dx
  1261 0000098F 6685C9                  		test    cx, cx
  1262 00000992 7404                    		jz      short OkPos
  1263 00000994 C6471900                		mov     byte [edi+TrackInfo.VibPos], 0
  1264                                  OkPos:          
  1265 00000998 C3                      		retn
  1266                                  SampleOfs:      
  1267 00000999 84D2                    		test    dl, dl
  1268 0000099B 7503                    		jnz     short SetSampleOfs
  1269 0000099D 8A571B                  		mov     dl, [edi+TrackInfo.OldSampOfs]
  1270                                  SetSampleOfs:
  1271 000009A0 88571B                  		mov     [edi+TrackInfo.OldSampOfs], dl
  1272 000009A3 88D6                    		mov     dh, dl
  1273 000009A5 81E200FF0000            		and 	edx, 0FF00h ; 05/03/2017
  1274 000009AB 895704                  		mov     [edi+TrackInfo.Position], edx
  1275 000009AE C3                      		retn
  1276                                  PosJump:
  1277 000009AF 8815[906C0000]          		mov     [OrderPos], dl
  1278 000009B5 C605[946C0000]40        		mov     byte [Row], 64
  1279 000009BC C3                      		retn
  1280                                  SetVolume:
  1281 000009BD 80FA40                  		cmp     dl, 64
  1282 000009C0 7602                    		jbe     short OkVol
  1283 000009C2 B240                    		mov     dl, 64
  1284                                  OkVol:
  1285 000009C4 88570E                  		mov     [edi+TrackInfo.Volume], dl
  1286 000009C7 C3                      		retn
  1287                                  Break:
  1288 000009C8 88D6                    		mov     dh, dl
  1289 000009CA 80E20F                  		and     dl, 0Fh
  1290 000009CD C0EE04                  		shr     dh, 4
  1291 000009D0 00F6                    		add     dh, dh
  1292 000009D2 00F2                    		add     dl, dh
  1293 000009D4 C0E602                  		shl     dh, 2
  1294 000009D7 00F2                    		add     dl, dh
  1295 000009D9 8815[956C0000]          		mov     [BreakRow], dl
  1296 000009DF C605[946C0000]40        		mov     byte [Row], 64
  1297 000009E6 C3                      		retn
  1298                                  SetSpeed:
  1299 000009E7 84D2                    		test    dl,dl
  1300 000009E9 7432                    		je      Skip
  1301 000009EB 80FA1F                  		cmp     dl,31
  1302 000009EE 770D                    		ja      short SetBpm
  1303                                  SetTempo:       
  1304 000009F0 8815[916C0000]          		mov     [Tempo], dl
  1305 000009F6 8815[926C0000]          		mov     [TempoWait], dl
  1306 000009FC C3                      		retn
  1307                                  SetBpm:
  1308 000009FD 8815[936C0000]          		mov     [Bpm], dl
  1309 00000A03 B067                    		mov     al, 103
  1310 00000A05 F6E2                    		mul     dl
  1311 00000A07 88E3                    		mov     bl, ah
  1312 00000A09 30FF                    		xor     bh, bh
  1313 00000A0B 66A1[E2120000]          		mov     ax, [MixSpeed]
  1314 00000A11 6631D2                  		xor     dx, dx
  1315 00000A14 66F7F3                  		div     bx
  1316 00000A17 66A3[966C0000]          		mov     [BpmSamples], ax
  1317                                  Skip:           
  1318 00000A1D C3                      		retn
  1319                                  InitArpeggio:
  1320 00000A1E 88D6                    		mov     dh, dl
  1321 00000A20 80E20F                  		and     dl, 0Fh
  1322 00000A23 C0EE04                  		shr     dh, 4
  1323 00000A26 66B92400                		mov     cx, 36
  1324 00000A2A 31DB                    		xor     ebx, ebx
  1325 00000A2C 668B4710                		mov     ax, [edi+TrackInfo.Period]
  1326                                  gt_ScanPeriod:
  1327 00000A30 66673B87[560E]          		cmp     ax, [PeriodTable+bx]
  1328 00000A36 7306                    		jae     short SetArp
  1329 00000A38 6683C302                		add     bx, 2
  1330 00000A3C E2F2                    		loop    gt_ScanPeriod
  1331                                  SetArp:         
  1332 00000A3E 6601D2                  		add     dx, dx
  1333 00000A41 00DE                    		add     dh, bl
  1334 00000A43 00DA                    		add     dl, bl
  1335 00000A45 66678B9F[560E]          		mov     bx, [PeriodTable+bx]
  1336 00000A4B 6601DB                  		add     bx, bx
  1337 00000A4E 66678B87[DE14]          		mov     ax, [PitchTable+bx]
  1338 00000A54 6689471C                		mov     [edi+TrackInfo.Arp], ax
  1339 00000A58 88F3                    		mov     bl, dh
  1340 00000A5A 30FF                    		xor     bh, bh
  1341 00000A5C 66678B9F[560E]          		mov     bx, [PeriodTable+bx]
  1342 00000A62 6601DB                  		add     bx, bx
  1343 00000A65 66678B87[DE14]          		mov     ax, [PitchTable+bx]
  1344 00000A6B 6689471E                		mov     [edi+TrackInfo.Arp+2], ax
  1345 00000A6F 88D3                    		mov     bl, dl
  1346 00000A71 30FF                    		xor     bh, bh
  1347 00000A73 66678B9F[560E]          		mov     bx, [PeriodTable+bx]
  1348 00000A79 6601DB                  		add     bx, bx
  1349 00000A7C 66678B87[DE14]          		mov     ax, [PitchTable+bx]
  1350 00000A82 66894720                		mov     [edi+TrackInfo.Arp+4], ax
  1351 00000A86 66C747220000            		mov     word [edi+TrackInfo.ArpIndex], 0
  1352 00000A8C C3                      		retn
  1353                                  
  1354                                  ;--------------------------------------------------------------------------
  1355                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1356                                  ;--------------------------------------------------------------------------
  1357                                  
  1358                                  UpdateTracks:
  1359 00000A8D FE0D[926C0000]          		dec     byte [TempoWait]
  1360 00000A93 7415                    		jz      short GetTracks
  1361                                  
  1362 00000A95 B904000000              		mov	ecx, NumTracks
  1363 00000A9A BF[A66C0000]            		mov	edi, Tracks
  1364                                  BeatTracks:
  1365 00000A9F E879FCFFFF              		call	BeatTrack	
  1366 00000AA4 83C724                  		add	edi, TrackInfo.size
  1367 00000AA7 E2F6                    		loop	BeatTracks
  1368 00000AA9 C3                      		retn
  1369                                  GetTracks:
  1370 00000AAA A0[916C0000]            		mov     al, [Tempo]
  1371 00000AAF A2[926C0000]            		mov     [TempoWait], al
  1372                                  
  1373 00000AB4 8B35[A26C0000]          		mov	esi, [Note]
  1374 00000ABA 803D[946C0000]40        		cmp     byte [Row], 64
  1375 00000AC1 7263                    		jb      short NoPattWrap
  1376                                  
  1377 00000AC3 8B35[66130000]          		mov	esi, [ModInfo.Patterns]
  1378 00000AC9 8A1D[906C0000]          		mov     bl, [OrderPos]
  1379 00000ACF 3A1D[E4120000]          		cmp     bl, [ModInfo.OrderLen]
  1380 00000AD5 7214                    		jb      short NoOrderWrap
  1381 00000AD7 8A1D[E5120000]          		mov     bl, [ModInfo.ReStart]
  1382 00000ADD 881D[906C0000]          		mov     [OrderPos], bl
  1383 00000AE3 3A1D[E4120000]          		cmp     bl, [ModInfo.OrderLen]
  1384 00000AE9 735D                    		jae     short NoUpdate
  1385                                  NoOrderWrap:    
  1386                                  		;xor	bh, bh
  1387 00000AEB 81E3FF000000            		and	ebx, 0FFh
  1388 00000AF1 8A9B[E6120000]          		mov     bl, [ModInfo.Order+ebx]
  1389 00000AF7 C1E30A                  		shl     ebx, 10 ; *1024
  1390 00000AFA 01DE                    		add     esi, ebx
  1391 00000AFC 8A1D[956C0000]          		mov     bl, [BreakRow]
  1392 00000B02 881D[946C0000]          		mov     [Row], bl
  1393                                  		;xor	bh, bh
  1394 00000B08 81E3FF000000            		and	ebx, 0FFh
  1395 00000B0E 883D[956C0000]          		mov     [BreakRow], bh ; 0
  1396 00000B14 66C1E304                		shl     bx, 4
  1397 00000B18 01DE                    		add     esi, ebx
  1398 00000B1A 8935[A26C0000]          		mov     [Note], esi
  1399 00000B20 FE05[906C0000]          		inc     byte [OrderPos]
  1400                                  NoPattWrap:     
  1401 00000B26 FE05[946C0000]          		inc     byte [Row]
  1402                                  
  1403                                  		;cld
  1404 00000B2C B904000000              		mov	ecx, NumTracks
  1405 00000B31 BF[A66C0000]            		mov	edi, Tracks
  1406                                  GetTracks_next:
  1407 00000B36 51                      		push	ecx		
  1408 00000B37 E856FDFFFF              		call	GetTrack
  1409 00000B3C 59                      		pop	ecx
  1410 00000B3D 83C724                  		add	edi, TrackInfo.size
  1411 00000B40 E2F4                    		loop	GetTracks_next
  1412                                  
  1413 00000B42 8935[A26C0000]          		mov     [Note], esi
  1414                                  NoUpdate:
  1415 00000B48 C3                      		retn
  1416                                  
  1417                                  ;--------------------------------------------------------------------------
  1418                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1419                                  ;  In:
  1420                                  ;   ds:si -  Track Info Address.
  1421                                  ;   ds:di -  Buffer Address.
  1422                                  ;    cx   -  Buffer Size.
  1423                                  ;--------------------------------------------------------------------------
  1424                                  
  1425                                  ; esi = Track info address
  1426                                  ; edi = Buffer address
  1427                                  ; ecx = Buffer size
  1428                                  
  1429                                  MixTrack:
  1430 00000B49 66837E0C02              		cmp     word [esi+TrackInfo.RepLen], 2
  1431 00000B4E 7748                    		ja      short MixLooped
  1432                                  MixNonLooped:   
  1433 00000B50 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1434 00000B52 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1435 00000B55 0FB76E08                		movzx   ebp, word [esi+TrackInfo.Len]
  1436 00000B59 52                      		push    edx
  1437 00000B5A 56                      		push    esi
  1438 00000B5B 01D3                    		add     ebx, edx
  1439 00000B5D 01D5                    		add     ebp, edx
  1440 00000B5F 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1441 00000B63 8A460E                  		mov     al, [esi+TrackInfo.Volume]
  1442 00000B66 8A660F                  		mov     ah, [esi+TrackInfo.Error]
  1443 00000B69 89DE                    		mov     esi, ebx
  1444 00000B6B 88C7                    		mov     bh, al
  1445 00000B6D 88D0                    		mov     al, dl
  1446 00000B6F 88F2                    		mov     dl, dh
  1447                                  		;xor	dh, dh
  1448 00000B71 81E2FF000000            		and	edx, 0FFh
  1449                                  nlMixSamp:      
  1450 00000B77 39EE                    		cmp     esi, ebp
  1451 00000B79 7310                    		jae     short nlMixBye
  1452 00000B7B 8A1E                    		mov     bl, [esi]
  1453 00000B7D 678A9F[901B]            		mov     bl, [VolTable+bx]
  1454 00000B82 001F                    		add     [edi], bl
  1455 00000B84 47                      		inc     edi
  1456 00000B85 00C4                    		add     ah, al
  1457 00000B87 11D6                    		adc     esi, edx
  1458 00000B89 E2EC                    		loop    nlMixSamp
  1459                                  nlMixBye:       
  1460 00000B8B 89F3                    		mov     ebx, esi
  1461 00000B8D 5E                      		pop     esi
  1462 00000B8E 5A                      		pop     edx
  1463 00000B8F 29D3                    		sub     ebx, edx
  1464 00000B91 895E04                  		mov     [esi+TrackInfo.Position], ebx
  1465 00000B94 88660F                  		mov     [esi+TrackInfo.Error], ah
  1466 00000B97 C3                      		retn
  1467                                  MixLooped:
  1468 00000B98 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1469 00000B9A 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1470 00000B9D 0FB76E0C                		movzx	ebp, word [esi+TrackInfo.RepLen]
  1471 00000BA1 892D[9E6C0000]          		mov     [BufRep], ebp
  1472 00000BA7 036E0A                  		add     ebp, [esi+TrackInfo.Repeat]
  1473 00000BAA 52                      		push    edx
  1474 00000BAB 56                      		push    esi
  1475 00000BAC 01D3                    		add     ebx, edx
  1476 00000BAE 01D5                    		add     ebp, edx
  1477 00000BB0 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1478 00000BB4 8A460E                  		mov     al, [esi+TrackInfo.Volume]
  1479 00000BB7 8A660F                  		mov     ah, [esi+TrackInfo.Error]
  1480 00000BBA 6689DE                  		mov     si, bx
  1481 00000BBD 88C7                    		mov     bh, al
  1482 00000BBF 88D0                    		mov     al, dl
  1483 00000BC1 88F2                    		mov     dl, dh
  1484                                  		;xor	dh, dh
  1485 00000BC3 81E2FF000000            		and	edx, 0FFh
  1486                                  lpMixSamp:      
  1487 00000BC9 39EE                    		cmp     esi, ebp
  1488 00000BCB 7206                    		jb      short lpMixNow
  1489 00000BCD 2B35[9E6C0000]          		sub     esi, [BufRep]
  1490                                  lpMixNow:       
  1491 00000BD3 8A1E                    		mov     bl, [esi]
  1492 00000BD5 678A9F[901B]            		mov     bl, [VolTable+bx]
  1493 00000BDA 001F                    		add     [edi], bl
  1494 00000BDC 47                      		inc     edi
  1495 00000BDD 00C4                    		add     ah, al
  1496 00000BDF 11D6                    		adc	esi, edx
  1497 00000BE1 E2E6                    		loop    lpMixSamp
  1498                                  lpMixBye:       
  1499                                  ;		mov     ebx, esi
  1500                                  ;		pop     esi
  1501                                  ;		pop     edx
  1502                                  ;		sub     ebx, edx
  1503                                  ;		mov     [esi+TrackInfo.Position], ebx
  1504                                  ;		mov     [esi+TrackInfo.Error], ah
  1505                                  ;		retn
  1506 00000BE3 EBA6                    		jmp	short nlMixBye
  1507                                  
  1508                                  ;--------------------------------------------------------------------------
  1509                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1510                                  ;  In:
  1511                                  ;    Buffer  - Buffer Address.
  1512                                  ;    Count   - Buffer Size.
  1513                                  ;--------------------------------------------------------------------------
  1514                                  
  1515                                  GetSamples:
  1516                                  		; edi = buffer address
  1517                                  		; ebx = count
  1518                                  
  1519 00000BE5 60                      		pushad
  1520                                  
  1521                                  		;cld
  1522                                  NextChunk:      
  1523 00000BE6 66833D[9C6C0000]00      		cmp     word [BufLen], 0
  1524 00000BEE 7548                    		jne     short CopyChunk
  1525                                  
  1526 00000BF0 53                      		push    ebx
  1527 00000BF1 57                      		push    edi
  1528                                  MixChunk:       
  1529 00000BF2 BF[905C0000]            		mov	edi, MixBuffer
  1530 00000BF7 0FB70D[966C0000]        		movzx	ecx, word [BpmSamples]
  1531                                  		;mov	cx, [BpmSamples]
  1532 00000BFE 893D[986C0000]          		mov     [BufPtr], edi
  1533 00000C04 66890D[9C6C0000]        		mov     [BufLen], cx
  1534                                  
  1535 00000C0B B080                    		mov     al, 80h
  1536 00000C0D F3AA                    		rep     stosb
  1537                                  
  1538 00000C0F 66B90400                		mov	cx, NumTracks
  1539 00000C13 BE[826C0000]            		mov	esi, Tracks - TrackInfo.size
  1540                                  GetSamples_next:
  1541 00000C18 51                      		push	ecx
  1542 00000C19 83C624                  		add	esi, TrackInfo.size
  1543 00000C1C 668B0D[9C6C0000]        		mov	cx, [BufLen]
  1544 00000C23 8B3D[986C0000]          		mov	edi, [BufPtr]
  1545 00000C29 E81BFFFFFF              		call	MixTrack
  1546 00000C2E 59                      		pop	ecx
  1547 00000C2F E2E7                    		loop	GetSamples_next		
  1548                                  
  1549 00000C31 E857FEFFFF              		call    UpdateTracks
  1550                                  
  1551 00000C36 5F                      		pop     edi
  1552 00000C37 5B                      		pop     ebx
  1553                                  CopyChunk:      
  1554                                  		;mov	cx, [BufLen]
  1555 00000C38 0FB70D[9C6C0000]        		movzx	ecx, word [BufLen]
  1556 00000C3F 39D9                    		cmp	ecx, ebx
  1557                                  		;cmp	cx, bx
  1558 00000C41 7602                    		jbe     short MoveChunk
  1559                                  		;mov	cx, bx
  1560 00000C43 89D9                    		mov     ecx, ebx
  1561                                  MoveChunk:
  1562 00000C45 8B35[986C0000]          		mov     esi, [BufPtr]
  1563 00000C4B 010D[986C0000]          		add     [BufPtr], ecx
  1564 00000C51 66290D[9C6C0000]        		sub     [BufLen], cx
  1565 00000C58 29CB                    		sub     ebx, ecx
  1566 00000C5A F3A4                    		rep     movsb
  1567 00000C5C 85DB                    		test    ebx, ebx
  1568 00000C5E 7586                    		jnz     short NextChunk
  1569                                  
  1570 00000C60 61                      		popad
  1571 00000C61 C3                      		retn
  1572                                  
  1573                                  ;--------------------------------------------------------------------------
  1574                                  ; StartPlaying: Initializes the Sound System.
  1575                                  ;  In:
  1576                                  ;   Module Information Resources.
  1577                                  ;--------------------------------------------------------------------------
  1578                                  
  1579                                  StartPlaying:
  1580 00000C62 60                      		pushad
  1581                                  SetModParms:    
  1582 00000C63 C605[906C0000]00        		mov     byte [OrderPos], 0
  1583 00000C6A C605[916C0000]06        		mov     byte [Tempo], DefTempo
  1584 00000C71 C605[926C0000]06        		mov     byte [TempoWait], DefTempo
  1585 00000C78 C605[936C0000]7D        		mov     byte [Bpm], DefBpm
  1586 00000C7F C605[946C0000]40        		mov     byte [Row], 64
  1587 00000C86 C605[956C0000]00        		mov     byte [BreakRow], 0
  1588 00000C8D 66A1[E2120000]          		mov     ax, [MixSpeed]
  1589 00000C93 31D2                    		xor     edx, edx
  1590 00000C95 66BB3200                		mov     bx, 24*DefBpm/60
  1591 00000C99 66F7F3                  		div     bx
  1592 00000C9C 66A3[966C0000]          		mov     [BpmSamples], ax
  1593                                  ClearTracks:    
  1594 00000CA2 BF[A66C0000]            		mov     edi, Tracks
  1595 00000CA7 B990000000              		mov     ecx, NumTracks*TrackInfo.size
  1596 00000CAC 31C0                    		xor     eax, eax
  1597                                  		;cld
  1598 00000CAE F3AA                    		rep     stosb
  1599                                  
  1600 00000CB0 A3[986C0000]            		mov     [BufPtr], eax
  1601 00000CB5 66A3[9C6C0000]          		mov     [BufLen], ax
  1602                                  MakePitch:
  1603 00000CBB 66B80021                		mov     ax, MidCRate
  1604 00000CBF 66BBAC01                		mov     bx, 428
  1605 00000CC3 66F7E3                  		mul     bx
  1606 00000CC6 66F735[E2120000]        		div     word [MixSpeed]
  1607 00000CCD 30F6                    		xor     dh, dh
  1608 00000CCF 88E2                    		mov     dl, ah
  1609 00000CD1 88C4                    		mov     ah, al
  1610 00000CD3 30C0                    		xor     al, al
  1611 00000CD5 66B95903                		mov     cx, 857
  1612 00000CD9 31DB                    		xor     ebx, ebx
  1613 00000CDB BF[DE140000]            		mov     edi, PitchTable
  1614                                  PitchLoop:      
  1615 00000CE0 50                      		push    eax
  1616 00000CE1 52                      		push    edx
  1617 00000CE2 6639DA                  		cmp     dx, bx
  1618 00000CE5 7303                    		jae     short NoDiv
  1619 00000CE7 66F7F3                  		div     bx
  1620                                  NoDiv:          
  1621 00000CEA 66AB                    		stosw
  1622 00000CEC 5A                      		pop     edx
  1623 00000CED 58                      		pop     eax
  1624 00000CEE 6643                    		inc     bx
  1625 00000CF0 E2EE                    		loop    PitchLoop
  1626                                  MakeVolume:     
  1627 00000CF2 66B90041                		mov     cx, 16640
  1628 00000CF6 89CB                    		mov     ebx, ecx
  1629                                  VolLoop:
  1630 00000CF8 664B                    		dec     bx
  1631 00000CFA 88D8                    		mov     al, bl
  1632 00000CFC F6EF                    		imul    bh
  1633 00000CFE 88A3[901B0000]          		mov     [VolTable+ebx], ah
  1634 00000D04 E2F2                    		loop    VolLoop
  1635                                  
  1636 00000D06 61                      		popad
  1637                                  		;retn
  1638                                  
  1639                                  ;--------------------------------------------------------------------------
  1640                                  ; StopPlaying: ShutDown the Sound System.
  1641                                  ;--------------------------------------------------------------------------
  1642                                  
  1643                                  StopPlaying:
  1644 00000D07 C3                      		retn
  1645                                  
  1646                                  ;=============================================================================
  1647                                  ;               preinitialized data
  1648                                  ;=============================================================================
  1649                                  
  1650                                  ;=============================================================================
  1651                                  ;               SB.ASM - DATA
  1652                                  ;=============================================================================
  1653                                  
  1654 00000D08 2002                    SbAddr:		dw      220h
  1655 00000D0A 07                      SbIrq:		db      7
  1656                                  ;Srbs:		db	0 
  1657                                  
  1658                                  ;=============================================================================
  1659                                  ;               PLAY.ASM - DATA
  1660                                  ;=============================================================================
  1661                                  
  1662                                  msg_usage:
  1663 00000D0B 54696E79204D4F4420-     		db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1663 00000D14 506C6179657220666F-
  1663 00000D1D 72205452444F532033-
  1663 00000D26 383620627920457264-
  1663 00000D2F 6F67616E2054616E2E-
  1663 00000D38 20                 
  1664 00000D39 417072696C20323031-     		db	'April 2017.',10,13
  1664 00000D42 372E0A0D           
  1665 00000D46 75736167653A207469-     		db	'usage: tinyplay filename.mod', 10, 13,0
  1665 00000D4F 6E79706C6179206669-
  1665 00000D58 6C656E616D652E6D6F-
  1665 00000D61 640A0D00           
  1666 00000D65 32322F30342F323031-     		db	'22/04/2017'
  1666 00000D6E 37                 
  1667                                  
  1668 00000D6F 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1668 00000D78 506C61796572207630-
  1668 00000D81 2E3162206279204361-
  1668 00000D8A 726C6F732048617361-
  1668 00000D93 6E2E204A756C792031-
  1668 00000D9C 3939332E           
  1669 00000DA0 0A0D00                  		db	10,13,0
  1670 00000DA3 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1670 00000DAC 64696E67204D6F6475-
  1670 00000DB5 6C652066696C652E0A-
  1670 00000DBE 0D00               
  1671 00000DC0 536F756E6420426C61-     MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1671 00000DC9 73746572206E6F7420-
  1671 00000DD2 666F756E64206F7220-
  1671 00000DDB 495251206572726F72-
  1671 00000DE4 2E0A0D00           
  1672 00000DE8 536F756E6420426C61-     MsgFound:	db	'Sound Blaster found at Address 2'
  1672 00000DF1 7374657220666F756E-
  1672 00000DFA 642061742041646472-
  1672 00000E03 6573732032         
  1673 00000E08 7830682C2049525120      PortText:	db	'x0h, IRQ '
  1674 00000E11 782E0A0D00              IrqText:	db	'x.',10,13,0
  1675                                  
  1676                                  trdos386_err_msg:
  1677 00000E16 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1677 00000E1F 2053797374656D2063-
  1677 00000E28 616C6C206572726F72-
  1677 00000E31 20210A0D00         
  1678                                  
  1679                                  ;=============================================================================
  1680                                  ;               MODPLAY.ASM - DATA
  1681                                  ;=============================================================================
  1682                                  
  1683                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1684                                  
  1685 00000E36 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1685 00000E3F C5D4E1             
  1686 00000E42 ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1686 00000E4B E1                 
  1687 00000E4C D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1687 00000E55 19                 
  1688                                  
  1689 00000E56 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1689 00000E5F 0280025C023A021A02-
  1689 00000E68 FC01E001C501       
  1690 00000E6E AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1690 00000E77 0140012E011D010D01-
  1690 00000E80 FE00F000E200       
  1691 00000E86 D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1691 00000E8F 00A00097008F008700-
  1691 00000E98 7F0078007100       
  1692                                  
  1693                                  bss_start:
  1694                                  
  1695                                  ABSOLUTE bss_start
  1696                                  
  1697                                  alignb 2
  1698                                  
  1699                                  ;=============================================================================
  1700                                  ;        	uninitialized data
  1701                                  ;=============================================================================
  1702                                  
  1703                                  ; SB.ASM
  1704 00000E9E <res 00000001>          DmaFlag		resb	1		
  1705                                  
  1706                                  ; 11/03/2017
  1707 00000E9F <res 00000001>          iStatus:	resb	1
  1708                                    
  1709                                  ; MODLOAD.ASM
  1710 00000EA0 <res 00000004>          FileHandle:	resd	1
  1711 00000EA4 <res 00000002>          ErrorInfo:	resw	1
  1712 00000EA6 <res 0000043C>          Header:		resb	ModHeader.size
  1713                                  
  1714                                  ; MODPLAY.ASM
  1715                                  sampling_rate:	; 11/03/2017
  1716 000012E2 <res 00000002>          MixSpeed:	resw 1
  1717                                  
  1718                                  ModInfo:
  1719 000012E4 <res 00000001>          ModInfo.OrderLen:   resb 1
  1720 000012E5 <res 00000001>          ModInfo.ReStart:    resb 1
  1721 000012E6 <res 00000080>          ModInfo.Order:	    resb 128
  1722 00001366 <res 00000004>          ModInfo.Patterns:   resd 1
  1723                                  
  1724 0000136A <res 0000003E>          ModInfo.SampOfs:    resw 31
  1725 000013A8 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1726 000013E6 <res 0000003E>          ModInfo.SampLen:    resw 31
  1727 00001424 <res 0000003E>          ModInfo.SampRep:    resw 31
  1728 00001462 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1729 000014A0 <res 0000003E>          ModInfo.SampVol:    resw 31
  1730                                  
  1731                                  ; MODPLAY.ASM
  1732 000014DE <res 000006B2>          PitchTable:	resw	857
  1733 00001B90 <res 00004100>          VolTable:	resb	16640
  1734 00005C90 <res 00001000>          MixBuffer       resb	MixBufSize
  1735                                  
  1736                                  ; MODPLAY.ASM
  1737 00006C90 <res 00000001>          OrderPos:	resb 1
  1738 00006C91 <res 00000001>          Tempo:		resb 1
  1739 00006C92 <res 00000001>          TempoWait:	resb 1
  1740 00006C93 <res 00000001>          Bpm:		resb 1
  1741 00006C94 <res 00000001>          Row:		resb 1
  1742 00006C95 <res 00000001>          BreakRow:	resb 1
  1743 00006C96 <res 00000002>          BpmSamples:	resw 1
  1744 00006C98 <res 00000004>          BufPtr:		resd 1
  1745 00006C9C <res 00000002>          BufLen:		resw 1
  1746 00006C9E <res 00000004>          BufRep:		resd 1
  1747 00006CA2 <res 00000004>          Note:		resd 1
  1748 00006CA6 <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1749                                  
  1750 00006D36 <res 0000000A>          alignb 16
  1751                                  
  1752                                  ; PLAY.ASM
  1753 00006D40 <res 00000280>          Scope:		resw	320
  1754 00006FC0 <res 00000200>          RowOfs:		resw	256
  1755                                  
  1756                                  ;03/03/2017
  1757 000071C0 <res 00000004>          DMA_phy_buff:	resd 1
  1758                                  mod_file_name:
  1759 000071C4 <res 00000010>          		resb 16
  1760                                  
  1761                                  ; 12/03/2017
  1762 000071D4 <res 00008E2C>          alignb 65536
  1763                                  
  1764                                  DmaBuffer:
  1765 00010000 <res 00010000>          DoubleBuffer:	resb 65536 ; DmaBufSize
  1766                                  file_buffer:
  1767 00020000 <res 00060000>          		resb 65536*6 ; 13/03/2017
  1768                                  EOF:
