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