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