     1                                  ; ****************************************************************************
     2                                  ; tinyplay.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TINYPLAY.PRG ! MOD PLAYER & VGA DEMO program ! by Erdogan TAN
     5                                  ;
     6                                  ; 03/03/2017
     7                                  ;
     8                                  ; [ Last Modification: 06/10/2017 ]
     9                                  ;
    10                                  ; Modified from 'TMODPLAY.COM' (tmodplay.asm) source code (for MSDOS)
    11                                  ; by Erdogan Tan - 01/10/2017
    12                                  ;
    13                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    14                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    15                                  ;
    16                                  ; Assembler: NASM 2.11
    17                                  ; ----------------------------------------------------------------------------
    18                                  ;	   nasm  tinyplay.s -l tinyplay.txt -o TINYPLAY.PRG	
    19                                  ; ****************************************************************************
    20                                  ; TINYPLAY.ASM by Erdogan Tan (for MSDOS) (13/02/2017)
    21                                  ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    22                                  
    23                                  ; 01/03/2017
    24                                  ; 16/10/2016
    25                                  ; 29/04/2016
    26                                  ; TRDOS 386 system calls (temporary list!)
    27                                  _ver 	equ 0
    28                                  _exit 	equ 1
    29                                  _fork 	equ 2
    30                                  _read 	equ 3
    31                                  _write	equ 4
    32                                  _open	equ 5
    33                                  _close 	equ 6
    34                                  _wait 	equ 7
    35                                  _creat 	equ 8
    36                                  _link 	equ 9
    37                                  _unlink	equ 10
    38                                  _exec	equ 11
    39                                  _chdir	equ 12
    40                                  _time 	equ 13
    41                                  _mkdir 	equ 14
    42                                  _chmod	equ 15
    43                                  _chown	equ 16
    44                                  _break	equ 17
    45                                  _stat	equ 18
    46                                  _seek	equ 19
    47                                  _tell 	equ 20
    48                                  _mount	equ 21
    49                                  _umount	equ 22
    50                                  _setuid	equ 23
    51                                  _getuid	equ 24
    52                                  _stime	equ 25
    53                                  _quit	equ 26	
    54                                  _intr	equ 27
    55                                  _fstat	equ 28
    56                                  _emt 	equ 29
    57                                  _mdate 	equ 30
    58                                  _video 	equ 31
    59                                  _audio	equ 32
    60                                  _timer	equ 33
    61                                  _sleep	equ 34
    62                                  _msg    equ 35
    63                                  _geterr	equ 36
    64                                  _fpsave	equ 37
    65                                  _pri	equ 38
    66                                  _rele	equ 39
    67                                  _fff	equ 40
    68                                  _fnf	equ 41
    69                                  _alloc	equ 42
    70                                  _dalloc equ 43
    71                                  _calbac equ 44				
    72                                  
    73                                  %macro sys 1-4
    74                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    75                                      ; 03/09/2015	
    76                                      ; 13/04/2015
    77                                      ; Retro UNIX 386 v1 system call.		
    78                                      %if %0 >= 2   
    79                                          mov ebx, %2
    80                                          %if %0 >= 3    
    81                                              mov ecx, %3
    82                                              %if %0 = 4
    83                                                 mov edx, %4   
    84                                              %endif
    85                                          %endif
    86                                      %endif
    87                                      mov eax, %1
    88                                      ;int 30h
    89                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    90                                  %endmacro
    91                                  
    92                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    93                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    94                                  
    95                                  
    96                                  ; ----------------------------------------------------------------------------
    97                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
    98                                  ;		July 14th, 1993.
    99                                  
   100                                  ;=============================================================================
   101                                  ;               PLAY.ASM
   102                                  ;=============================================================================
   103                                  
   104                                  [BITS 32]
   105                                  [org 0]
   106                                  
   107                                  Start:
   108                                  		; clear bss
   109 00000000 B9[00000800]            		mov	ecx, EOF
   110 00000005 BF[8B0F0000]            		mov	edi, bss_start
   111 0000000A 29F9                    		sub	ecx, edi
   112 0000000C C1E902                  		shr	ecx, 2
   113                                  		;xor	eax, eax
   114 0000000F F3AB                    		rep	stosd
   115                                  
   116                                  GetFileName:  
   117 00000011 89E6                    		mov	esi, esp
   118 00000013 AD                      		lodsd
   119 00000014 83F802                  		cmp	eax, 2 ; two arguments 
   120                                  			       ; (program file name & mod file name)
   121 00000017 0F8299010000            		jb	pmsg_usage ; nothing to do
   122                                  
   123 0000001D AD                      		lodsd ; program file name address 
   124 0000001E AD                      		lodsd ; mod file name address (file to be read)
   125 0000001F 89C6                    		mov	esi, eax
   126 00000021 BF[64870000]            		mov	edi, mod_file_name
   127                                  ScanName:       
   128 00000026 AC                      		lodsb
   129 00000027 84C0                    		test	al, al
   130 00000029 0F8487010000            		je	pmsg_usage
   131 0000002F 3C20                    		cmp	al, 20h
   132 00000031 74F3                    		je	short ScanName		; scan start of name.
   133 00000033 AA                      		stosb
   134 00000034 B4FF                    		mov	ah, 0FFh
   135                                  a_0:	
   136 00000036 FEC4                    		inc	ah
   137                                  a_1:
   138 00000038 AC                      		lodsb
   139 00000039 AA                      		stosb
   140 0000003A 3C2E                    		cmp	al, '.'
   141 0000003C 74F8                    		je	short a_0	
   142 0000003E 20C0                    		and	al, al
   143 00000040 75F6                    		jnz	short a_1
   144                                  
   145 00000042 08E4                    		or	ah, ah			; if period NOT found,
   146 00000044 750B                    		jnz	short a_2		; then add a .MOD extension.
   147                                  SetExt:
   148 00000046 4F                      		dec	edi
   149 00000047 C7072E4D4F44            		mov	dword [edi], '.MOD'
   150 0000004D C6470400                		mov	byte [edi+4], 0
   151                                  a_2:
   152                                  		; Prints the Credits Text.
   153                                  		sys	_msg, Credits, 255, 0Ch
   153                              <1> 
   153                              <1> 
   153                              <1> 
   153                              <1> 
   153                              <1>  %if %0 >= 2
   153 00000051 BB[C10E0000]        <1>  mov ebx, %2
   153                              <1>  %if %0 >= 3
   153 00000056 B9FF000000          <1>  mov ecx, %3
   153                              <1>  %if %0 = 4
   153 0000005B BA0C000000          <1>  mov edx, %4
   153                              <1>  %endif
   153                              <1>  %endif
   153                              <1>  %endif
   153 00000060 B823000000          <1>  mov eax, %1
   153                              <1> 
   153 00000065 CD40                <1>  int 40h
   154                                  
   155 00000067 E862010000              		call    DetectSb		; Detect the SB Addr, Irq.
   156                                  LoadMod:  
   157 0000006C BF[64870000]            		mov	edi, mod_file_name
   158 00000071 E8EC040000              		call    LoadModule		; Load the MODule...
   159                                  		; 06/10/2017
   160 00000076 731B                    		jnc	short PlayNow		; any error loading?
   161                                  		
   162                                  		; yes, print error and Exit.
   163                                  
   164                                  		sys	_msg, ErrorMesg, 255, 0Fh
   164                              <1> 
   164                              <1> 
   164                              <1> 
   164                              <1> 
   164                              <1>  %if %0 >= 2
   164 00000078 BB[F50E0000]        <1>  mov ebx, %2
   164                              <1>  %if %0 >= 3
   164 0000007D B9FF000000          <1>  mov ecx, %3
   164                              <1>  %if %0 = 4
   164 00000082 BA0F000000          <1>  mov edx, %4
   164                              <1>  %endif
   164                              <1>  %endif
   164                              <1>  %endif
   164 00000087 B823000000          <1>  mov eax, %1
   164                              <1> 
   164 0000008C CD40                <1>  int 40h
   165                                  
   166 0000008E E917010000              		jmp     Exit
   167                                  
   168                                  PlayNow: 
   169                                  		;; DIRECT MEMORY ACCESS (for Audio DMA)
   170                                  		;; ebx = DMA buffer address (virtual, user)
   171                                  		;; ecx = buffer size (in bytes)
   172                                  		;; edx = upper limit = 16MB
   173                                  
   174                                  		;_16MB	equ 1024*1024*16	
   175                                  
   176                                  		;sys	_alloc, DoubleBuffer, DmaBufSize, _16MB 
   177                                  		;jc	short error_exit
   178                                  
   179                                  		; 12/05/2017
   180                                  		sys	_audio, 0D00h, DmaBufSize, DoubleBuffer
   180                              <1> 
   180                              <1> 
   180                              <1> 
   180                              <1> 
   180                              <1>  %if %0 >= 2
   180 00000093 BB000D0000          <1>  mov ebx, %2
   180                              <1>  %if %0 >= 3
   180 00000098 B900000100          <1>  mov ecx, %3
   180                              <1>  %if %0 = 4
   180 0000009D BA[00000100]        <1>  mov edx, %4
   180                              <1>  %endif
   180                              <1>  %endif
   180                              <1>  %endif
   180 000000A2 B820000000          <1>  mov eax, %1
   180                              <1> 
   180 000000A7 CD40                <1>  int 40h
   181 000000A9 724A                    		jc	short error_exit
   182                                  
   183 000000AB A3[30860000]            		mov	[DMA_phy_buff], eax	; physical address
   184                                  					     	; of the buffer
   185                                  						; (which is needed
   186                                  						; for DMA controller)
   187                                  		; 11/03/2017 (22000 -> 22050)
   188 000000B0 66C705[8E0F0000]22-     		mov	word [MixSpeed], 22050	; Mixing at 22 kHz
   188 000000B8 56                 
   189                                  
   190                                  ;		call    StartPlaying            ; PLAY!
   191                                  
   192 000000B9 E80E030000              		call    SbInit
   193                                  
   194 000000BE B980000000              		mov     ecx, 128		; Make a lookup table
   195 000000C3 31DB                    		xor     ebx, ebx		; for fastest pixel
   196 000000C5 BA002D0000              		mov     edx, 320*(100-64)	; addressing.
   197                                  MakeOfs:        
   198 000000CA 668993[30840000]        		mov     [RowOfs+ebx], dx
   199 000000D1 668993[32840000]        		mov     [RowOfs+ebx+2], dx
   200 000000D8 6681C24001              		add     dx, 320
   201 000000DD 83C304                  		add     ebx, 4
   202 000000E0 E2E8                    		loop    MakeOfs
   203                                  
   204                                  		;cld
   205                                  
   206                                  		; DIRECT VGA MEMORY ACCESS
   207                                  		; bl = 0, bh = 5
   208                                  		; Direct access/map to VGA memory (0A0000h)
   209                                  
   210                                  		sys	_video, 0500h
   210                              <1> 
   210                              <1> 
   210                              <1> 
   210                              <1> 
   210                              <1>  %if %0 >= 2
   210 000000E2 BB00050000          <1>  mov ebx, %2
   210                              <1>  %if %0 >= 3
   210                              <1>  mov ecx, %3
   210                              <1>  %if %0 = 4
   210                              <1>  mov edx, %4
   210                              <1>  %endif
   210                              <1>  %endif
   210                              <1>  %endif
   210 000000E7 B81F000000          <1>  mov eax, %1
   210                              <1> 
   210 000000EC CD40                <1>  int 40h
   211 000000EE 3D00000A00              		cmp	eax, 0A0000h
   212 000000F3 741B                    		je	short start_scope
   213                                  
   214                                  error_exit:
   215                                  		sys	_msg, trdos386_err_msg, 255, 0Eh
   215                              <1> 
   215                              <1> 
   215                              <1> 
   215                              <1> 
   215                              <1>  %if %0 >= 2
   215 000000F5 BB[680F0000]        <1>  mov ebx, %2
   215                              <1>  %if %0 >= 3
   215 000000FA B9FF000000          <1>  mov ecx, %3
   215                              <1>  %if %0 = 4
   215 000000FF BA0E000000          <1>  mov edx, %4
   215                              <1>  %endif
   215                              <1>  %endif
   215                              <1>  %endif
   215 00000104 B823000000          <1>  mov eax, %1
   215                              <1> 
   215 00000109 CD40                <1>  int 40h
   216                                  		;jmp	short Exit
   217 0000010B E99A000000              		jmp	Exit
   218                                  		 	
   219                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   220                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   221                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   222                                  ;       second, or the module will sound "looped".
   223                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   224                                  ;       the polling is called from my routine, and then the irq 0 must be
   225                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   226                                  ;       samples played by the Sound Blaster. Note that some samples are
   227                                  ;       discarded in the next code, just for fun!
   228                                  
   229                                  start_scope:
   230                                  		; mov	ax, 0A000h
   231                                  		; mov	es, ax
   232 00000110 89C7                    		mov	edi, eax  ; 0A0000h
   233                                  
   234                                  		;mov	byte [tLoop], 1
   235                                  	
   236                                  		; 11/03/2017
   237 00000112 66B81300                		mov     ax, 0013h		; Set Mode 320x200x256
   238 00000116 CD31                    		int     31h
   239                                  ScopeLoop:
   240                                  		; ModPlay Polling!
   241 00000118 E882020000              		call    SbPoll
   242                                  
   243                                  		;cmp	byte [tLoop], 1
   244                                  		;jb	short _StopPlay
   245                                  
   246                                  		; 06/10/2017
   247 0000011D BE[00000100]            		mov	esi, DmaBuffer		; get current samples
   248                                  						; to be drawed ...
   249                                  		; 12/03/2017
   250                                  		; original tinyplay scope drawing code is for 1K buffer
   251                                  		; but now we have 32K buffer, following code is for that...
   252                                  GetDmaCount:
   253                                  		;in	al, 03h
   254 00000122 66BA0300                		mov	dx, 03h
   255 00000126 B400                    		mov	ah, 0 ; inb
   256 00000128 CD34                    		int	34h	
   257 0000012A 88C1                    		mov	cl, al
   258                                  		;in	al, 03h
   259                                  		;mov	ah, 0 ; inb
   260 0000012C CD34                    		int	34h
   261 0000012E 88C5                    		mov     ch, al
   262                                  		; 06/10/2017
   263                                  		;mov	dx, 65535
   264 00000130 BAFFFF0000              		mov	edx, DmaBufSize - 1
   265                                  		;mov	esi, DmaBufSize - 1  ; <= 65535
   266 00000135 6629CA                  		sub	dx, cx
   267                                  		;sub	si, cx
   268                                  		; 15/03/2017
   269 00000138 6681EAA000              		sub	dx, 160
   270                                  		;add	si, dx
   271 0000013D 01D6                    		add	esi, edx ; 06/10/2017
   272                                  		; 06/10/2017
   273                                  		;sub	si, 160
   274                                  		;and	si, DmaBufSize - 1
   275                                  		;
   276 0000013F 31C9                    		xor     ecx, ecx			
   277 00000141 31D2                    		xor     edx, edx
   278                                  DrawLoop:       
   279 00000143 6689D3                  		mov     bx, dx			; (save Index)
   280 00000146 66678BBF[B081]          		mov     di, [Scope+bx]		; get old SCOPE pixel address
   281                                  		;mov    byte [es:di], 0		; erase it!
   282 0000014C C60700                  		mov	byte [edi], 0
   283                                  		;lodsb				; get a sample (8-bit)
   284                                  		;mov	bl, al
   285                                  		;15/03/2017
   286 0000014F 8A1E                    		mov	bl, [esi]		; calc new pixel address...
   287 00000151 6646                    		inc	si
   288                                  		; 06/10/2017
   289                                  		;and	si, DmaBufSize - 1
   290                                  		;mov	bl, [esi+DmaBuffer]
   291                                  		;inc	si
   292                                  		;;and	si, DmaBufSize - 1
   293                                  		;
   294 00000153 30FF                    		xor     bh, bh
   295 00000155 66D1E3                  		shl     bx, 1
   296 00000158 66678BBF[3084]          		mov     di, [RowOfs+bx]
   297 0000015E 6601CF                  		add     di, cx
   298 00000161 6689D3                  		mov     bx, dx			; (restore Index)
   299 00000164 666789BF[B081]          		mov     [Scope+bx], di		; save new address...
   300                                  		;mov	byte [es:di], 10	; and DRAW.
   301 0000016A C6070A                  		mov	byte [edi], 10
   302 0000016D 6683C202                		add     dx, 2			; the next pixel...
   303 00000171 6641                    		inc     cx
   304 00000173 6681F94001              		cmp     cx, 320			; 320 pixels drawed?
   305 00000178 72C9                    		jb      short DrawLoop
   306                                  CheckAnyKey:
   307 0000017A B401                    		mov     ah, 1			; any key pressed?
   308 0000017C CD32                    		int     32h			; no, Loop.
   309 0000017E 7498                    		jz	short ScopeLoop
   310                                  
   311 00000180 B400                    		mov     ah, 0			; flush key buffer...
   312 00000182 CD32                    		int     32h
   313                                  
   314 00000184 66B80300                		mov     ax, 0003h		; Set Text Mode 80x25x16
   315 00000188 CD31                    		int     31h
   316                                  
   317                                  		;call	StopPlaying		; STOP!
   318                                  
   319                                  		;mov	byte [tLoop], 0
   320                                  _StopPlay:
   321                                  		; 11/03/2017
   322 0000018A 30C0                    		xor     al, al
   323                                  		; Stop 8 bit (autoinitialized) DMA process	
   324                                  		;out	0Ch, al
   325                                  		;retn
   326 0000018C 66BA0C00                		mov	dx, 0Ch
   327 00000190 B401                    		mov	ah, 1 ;outb
   328 00000192 CD34                    		int	34h
   329                                  
   330 00000194 E88B030000              		call	SbDone
   331                                  
   332                                  		; Deallocate DMA buffer (not necessary just before exit!)
   333                                  		sys	_dalloc, DoubleBuffer, DmaBufSize
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1>  %if %0 >= 2
   333 00000199 BB[00000100]        <1>  mov ebx, %2
   333                              <1>  %if %0 >= 3
   333 0000019E B900000100          <1>  mov ecx, %3
   333                              <1>  %if %0 = 4
   333                              <1>  mov edx, %4
   333                              <1>  %endif
   333                              <1>  %endif
   333                              <1>  %endif
   333 000001A3 B82B000000          <1>  mov eax, %1
   333                              <1> 
   333 000001A8 CD40                <1>  int 40h
   334                                  		;jc	error_exit
   335                                  Exit:           
   336 000001AA E831050000              		call    FreeModule              ; Free MODule core.
   337                                  
   338                                  		sys	_exit			; Bye!
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1>  %if %0 >= 2
   338                              <1>  mov ebx, %2
   338                              <1>  %if %0 >= 3
   338                              <1>  mov ecx, %3
   338                              <1>  %if %0 = 4
   338                              <1>  mov edx, %4
   338                              <1>  %endif
   338                              <1>  %endif
   338                              <1>  %endif
   338 000001AF B801000000          <1>  mov eax, %1
   338                              <1> 
   338 000001B4 CD40                <1>  int 40h
   339                                  
   340                                  pmsg_usage:
   341                                  		sys	_msg, msg_usage, 255, 0Ah
   341                              <1> 
   341                              <1> 
   341                              <1> 
   341                              <1> 
   341                              <1>  %if %0 >= 2
   341 000001B6 BB[5A0E0000]        <1>  mov ebx, %2
   341                              <1>  %if %0 >= 3
   341 000001BB B9FF000000          <1>  mov ecx, %3
   341                              <1>  %if %0 = 4
   341 000001C0 BA0A000000          <1>  mov edx, %4
   341                              <1>  %endif
   341                              <1>  %endif
   341                              <1>  %endif
   341 000001C5 B823000000          <1>  mov eax, %1
   341                              <1> 
   341 000001CA CD40                <1>  int 40h
   342 000001CC EBDC                    		jmp	short Exit
   343                                  
   344                                  DetectSb:
   345 000001CE 60                      		pushad
   346                                  ScanPort:
   347 000001CF 66BB1002                		mov     bx, 210h		; start scanning ports
   348                                  						; 210h, 220h, .. 260h
   349                                  ResetDSP:       
   350 000001D3 6689DA                  		mov     dx, bx			; try to reset the DSP.
   351 000001D6 6683C206                		add     dx, 06h
   352 000001DA B001                    		mov	al, 1
   353                                  		;out	dx, al
   354 000001DC B401                    		mov	ah, 1 ; outb
   355 000001DE CD34                    		int	34h
   356                                  
   357                                  		;in	al, dx
   358                                  		;in	al, dx
   359                                  		;in	al, dx
   360                                  		;in	al, dx
   361                                  
   362 000001E0 B400                    		mov	ah, 0 ; inb
   363 000001E2 CD34                    		int	34h
   364                                  		;mov	ah, 0 ; inb
   365 000001E4 CD34                    		int	34h
   366                                  
   367 000001E6 30C0                    		xor     al, al
   368                                  		;out	dx, al
   369 000001E8 B401                    		mov	ah, 1 ; outb
   370 000001EA CD34                    		int	34h
   371                                  
   372 000001EC 6683C208                		add     dx, 08h
   373                                  		;mov	cx, 100
   374 000001F0 66B92000                		mov	cx, 32
   375 000001F4 28E4                    		sub	ah, ah ; 0
   376                                  WaitID:
   377                                  		;in	al, dx
   378 000001F6 CD34                    		int	34h  ;ah = 0 ; inb
   379 000001F8 08C0                    		or      al, al
   380 000001FA 7804                    		js      short GetID
   381 000001FC E2F8                    		loop    WaitID
   382 000001FE EB10                    		jmp     short NextPort
   383                                  GetID:          
   384 00000200 6683EA04                		sub     dx, 04h
   385                                  		;in	al, dx
   386 00000204 CD34                    		int	34h  ;ah = 0 ; inb
   387 00000206 3CAA                    		cmp     al, 0AAh
   388 00000208 7416                    		je      short Found
   389 0000020A 6683C204                		add     dx, 04h
   390 0000020E E2E6                    		loop    WaitID
   391                                  NextPort:
   392 00000210 6683C310                		add     bx, 10h			; if not response,
   393 00000214 6681FB6002              		cmp     bx, 260h		; try the next port.
   394 00000219 76B8                    		jbe     short ResetDSP
   395 0000021B E934010000              		jmp     Fail
   396                                  Found:
   397 00000220 66891D[0D0D0000]        		mov     [SbAddr], bx		; SB Port Address Found!
   398                                  ScanIRQ:
   399                                  SetIrqs:        ; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ
   400                                  		sys	_calbac, 102h, 2, SbIrq ; IRQ 2
   400                              <1> 
   400                              <1> 
   400                              <1> 
   400                              <1> 
   400                              <1>  %if %0 >= 2
   400 00000227 BB02010000          <1>  mov ebx, %2
   400                              <1>  %if %0 >= 3
   400 0000022C B902000000          <1>  mov ecx, %3
   400                              <1>  %if %0 = 4
   400 00000231 BA[0F0D0000]        <1>  mov edx, %4
   400                              <1>  %endif
   400                              <1>  %endif
   400                              <1>  %endif
   400 00000236 B82C000000          <1>  mov eax, %1
   400                              <1> 
   400 0000023B CD40                <1>  int 40h
   401                                  						; Signal Response Byte
   402                                  		;jc	short error_exit
   403                                  
   404                                  		sys	_calbac, 103h, 3, SbIrq ; IRQ 3
   404                              <1> 
   404                              <1> 
   404                              <1> 
   404                              <1> 
   404                              <1>  %if %0 >= 2
   404 0000023D BB03010000          <1>  mov ebx, %2
   404                              <1>  %if %0 >= 3
   404 00000242 B903000000          <1>  mov ecx, %3
   404                              <1>  %if %0 = 4
   404 00000247 BA[0F0D0000]        <1>  mov edx, %4
   404                              <1>  %endif
   404                              <1>  %endif
   404                              <1>  %endif
   404 0000024C B82C000000          <1>  mov eax, %1
   404                              <1> 
   404 00000251 CD40                <1>  int 40h
   405                                  						; Signal Response Byte 
   406                                  		;jc	short error_exit
   407                                  
   408                                  		sys	_calbac, 104h, 4, SbIrq ; IRQ 4
   408                              <1> 
   408                              <1> 
   408                              <1> 
   408                              <1> 
   408                              <1>  %if %0 >= 2
   408 00000253 BB04010000          <1>  mov ebx, %2
   408                              <1>  %if %0 >= 3
   408 00000258 B904000000          <1>  mov ecx, %3
   408                              <1>  %if %0 = 4
   408 0000025D BA[0F0D0000]        <1>  mov edx, %4
   408                              <1>  %endif
   408                              <1>  %endif
   408                              <1>  %endif
   408 00000262 B82C000000          <1>  mov eax, %1
   408                              <1> 
   408 00000267 CD40                <1>  int 40h
   409                                  						; Signal Response Byte 
   410                                  		;jc	short error_exit
   411                                  
   412                                  		sys	_calbac, 105h, 5, SbIrq ; IRQ 5
   412                              <1> 
   412                              <1> 
   412                              <1> 
   412                              <1> 
   412                              <1>  %if %0 >= 2
   412 00000269 BB05010000          <1>  mov ebx, %2
   412                              <1>  %if %0 >= 3
   412 0000026E B905000000          <1>  mov ecx, %3
   412                              <1>  %if %0 = 4
   412 00000273 BA[0F0D0000]        <1>  mov edx, %4
   412                              <1>  %endif
   412                              <1>  %endif
   412                              <1>  %endif
   412 00000278 B82C000000          <1>  mov eax, %1
   412                              <1> 
   412 0000027D CD40                <1>  int 40h
   413                                  						; Signal Response Byte 
   414                                  		;jc	short error_exit
   415                                  
   416                                  		sys	_calbac, 107h, 7, SbIrq ; IRQ 7
   416                              <1> 
   416                              <1> 
   416                              <1> 
   416                              <1> 
   416                              <1>  %if %0 >= 2
   416 0000027F BB07010000          <1>  mov ebx, %2
   416                              <1>  %if %0 >= 3
   416 00000284 B907000000          <1>  mov ecx, %3
   416                              <1>  %if %0 = 4
   416 00000289 BA[0F0D0000]        <1>  mov edx, %4
   416                              <1>  %endif
   416                              <1>  %endif
   416                              <1>  %endif
   416 0000028E B82C000000          <1>  mov eax, %1
   416                              <1> 
   416 00000293 CD40                <1>  int 40h
   417                                  						; Signal Response Byte 
   418                                  		;jc	short error_exit
   419                                  
   420 00000295 C605[0F0D0000]00        		mov     byte [SbIrq], 0		; clear the IRQ level.
   421                                  
   422 0000029C 668B15[0D0D0000]        		mov     dx, [SbAddr]		; tells to the SB to
   423 000002A3 6683C20C                		add     dx, 0Ch			; generate a IRQ!
   424                                  WaitSb:         ;in	al, dx
   425 000002A7 B400                    		mov	ah, 0 ; inb
   426 000002A9 CD34                    		int	34h
   427 000002AB 08C0                    		or      al, al
   428 000002AD 78F8                    		js      short WaitSb
   429 000002AF B0F2                    		mov     al, 0F2h
   430                                  		;out	dx, al
   431 000002B1 B401                    		mov	ah,1  ; outb
   432 000002B3 CD34                    		int	34h		
   433                                  
   434 000002B5 31C9                    		xor     ecx, ecx		; wait until IRQ level
   435                                  WaitIRQ:        
   436 000002B7 803D[0F0D0000]00        		cmp     byte [SbIrq], 0		; is changed or timeout.
   437 000002BE 7506                    		jne     short IrqOk
   438 000002C0 6649                    		dec 	cx
   439 000002C2 75F3                    		jnz	short WaitIRQ
   440 000002C4 EB0F                    		jmp	short RestoreIrqs
   441                                  IrqOk:
   442 000002C6 668B15[0D0D0000]        		mov     dx, [SbAddr]
   443 000002CD 6683C20E                		add     dx, 0Eh
   444                                  		;in	al, dx			; SB acknowledge.
   445 000002D1 B400                    		mov	ah, 0 ; inb
   446 000002D3 CD34                    		int	34h
   447                                  		;mov	al, 20h
   448                                  		;;out	20h, al			; Hardware acknowledge.
   449                                  		;mov	ah,1  ; outb
   450                                  		;int	34h		
   451                                  
   452                                  RestoreIrqs:    ; UNLINK SIGNAL RESPONSE/RETURN BYTE FROM REQUESTED IRQ
   453                                  		sys	_calbac, 2		; unlink IRQ 2
   453                              <1> 
   453                              <1> 
   453                              <1> 
   453                              <1> 
   453                              <1>  %if %0 >= 2
   453 000002D5 BB02000000          <1>  mov ebx, %2
   453                              <1>  %if %0 >= 3
   453                              <1>  mov ecx, %3
   453                              <1>  %if %0 = 4
   453                              <1>  mov edx, %4
   453                              <1>  %endif
   453                              <1>  %endif
   453                              <1>  %endif
   453 000002DA B82C000000          <1>  mov eax, %1
   453                              <1> 
   453 000002DF CD40                <1>  int 40h
   454                                  						; Signal Response Byte
   455                                  		sys	_calbac, 3		; unlink IRQ 3
   455                              <1> 
   455                              <1> 
   455                              <1> 
   455                              <1> 
   455                              <1>  %if %0 >= 2
   455 000002E1 BB03000000          <1>  mov ebx, %2
   455                              <1>  %if %0 >= 3
   455                              <1>  mov ecx, %3
   455                              <1>  %if %0 = 4
   455                              <1>  mov edx, %4
   455                              <1>  %endif
   455                              <1>  %endif
   455                              <1>  %endif
   455 000002E6 B82C000000          <1>  mov eax, %1
   455                              <1> 
   455 000002EB CD40                <1>  int 40h
   456                                  						; Signal Response Byte 
   457                                  		sys	_calbac, 4		; unlink IRQ 4
   457                              <1> 
   457                              <1> 
   457                              <1> 
   457                              <1> 
   457                              <1>  %if %0 >= 2
   457 000002ED BB04000000          <1>  mov ebx, %2
   457                              <1>  %if %0 >= 3
   457                              <1>  mov ecx, %3
   457                              <1>  %if %0 = 4
   457                              <1>  mov edx, %4
   457                              <1>  %endif
   457                              <1>  %endif
   457                              <1>  %endif
   457 000002F2 B82C000000          <1>  mov eax, %1
   457                              <1> 
   457 000002F7 CD40                <1>  int 40h
   458                                  						; Signal Response Byte 
   459                                  		sys	_calbac, 5		; unlink IRQ 5
   459                              <1> 
   459                              <1> 
   459                              <1> 
   459                              <1> 
   459                              <1>  %if %0 >= 2
   459 000002F9 BB05000000          <1>  mov ebx, %2
   459                              <1>  %if %0 >= 3
   459                              <1>  mov ecx, %3
   459                              <1>  %if %0 = 4
   459                              <1>  mov edx, %4
   459                              <1>  %endif
   459                              <1>  %endif
   459                              <1>  %endif
   459 000002FE B82C000000          <1>  mov eax, %1
   459                              <1> 
   459 00000303 CD40                <1>  int 40h
   460                                  						; Signal Response Byte
   461                                  		sys	_calbac, 7		; unlink IRQ 7
   461                              <1> 
   461                              <1> 
   461                              <1> 
   461                              <1> 
   461                              <1>  %if %0 >= 2
   461 00000305 BB07000000          <1>  mov ebx, %2
   461                              <1>  %if %0 >= 3
   461                              <1>  mov ecx, %3
   461                              <1>  %if %0 = 4
   461                              <1>  mov edx, %4
   461                              <1>  %endif
   461                              <1>  %endif
   461                              <1>  %endif
   461 0000030A B82C000000          <1>  mov eax, %1
   461                              <1> 
   461 0000030F CD40                <1>  int 40h
   462                                  						; Signal Response Byte 
   463                                  
   464 00000311 803D[0F0D0000]00        		cmp     byte [SbIrq], 0		; IRQ level was changed?
   465 00000318 743A                    		je      short Fail		; no, fail.
   466                                  Success:        
   467 0000031A 668B15[0D0D0000]        		mov     dx, [SbAddr]		; Print Sucessful message.
   468 00000321 8A0D[0F0D0000]          		mov     cl, [SbIrq]
   469 00000327 C0EA04                  		shr     dl, 4
   470 0000032A 80C230                  		add     dl, '0'
   471 0000032D 8815[5A0F0000]          		mov     [PortText], dl
   472 00000333 80C130                  		add     cl, '0'
   473 00000336 880D[630F0000]          		mov     [IrqText], cl
   474                                  
   475                                  		sys	_msg, MsgFound, 255, 0Fh
   475                              <1> 
   475                              <1> 
   475                              <1> 
   475                              <1> 
   475                              <1>  %if %0 >= 2
   475 0000033C BB[3A0F0000]        <1>  mov ebx, %2
   475                              <1>  %if %0 >= 3
   475 00000341 B9FF000000          <1>  mov ecx, %3
   475                              <1>  %if %0 = 4
   475 00000346 BA0F000000          <1>  mov edx, %4
   475                              <1>  %endif
   475                              <1>  %endif
   475                              <1>  %endif
   475 0000034B B823000000          <1>  mov eax, %1
   475                              <1> 
   475 00000350 CD40                <1>  int 40h
   476                                  
   477 00000352 61                      		popad				; Return to caller.
   478 00000353 C3                      		retn
   479                                  
   480                                  Fail:  
   481                                  		; Print Failed Message,
   482                                  		; and exit to MainProg.
   483                                  
   484                                  		sys	_msg, MsgNotFound, 255, 0Fh
   484                              <1> 
   484                              <1> 
   484                              <1> 
   484                              <1> 
   484                              <1>  %if %0 >= 2
   484 00000354 BB[120F0000]        <1>  mov ebx, %2
   484                              <1>  %if %0 >= 3
   484 00000359 B9FF000000          <1>  mov ecx, %3
   484                              <1>  %if %0 = 4
   484 0000035E BA0F000000          <1>  mov edx, %4
   484                              <1>  %endif
   484                              <1>  %endif
   484                              <1>  %endif
   484 00000363 B823000000          <1>  mov eax, %1
   484                              <1> 
   484 00000368 CD40                <1>  int 40h
   485                                  
   486                                  		sys 	_exit
   486                              <1> 
   486                              <1> 
   486                              <1> 
   486                              <1> 
   486                              <1>  %if %0 >= 2
   486                              <1>  mov ebx, %2
   486                              <1>  %if %0 >= 3
   486                              <1>  mov ecx, %3
   486                              <1>  %if %0 = 4
   486                              <1>  mov edx, %4
   486                              <1>  %endif
   486                              <1>  %endif
   486                              <1>  %endif
   486 0000036A B801000000          <1>  mov eax, %1
   486                              <1> 
   486 0000036F CD40                <1>  int 40h
   487                                  here:
   488 00000371 EBFE                    		jmp	short here
   489                                  
   490                                  ;=============================================================================
   491                                  ;               SB.ASM
   492                                  ;=============================================================================
   493                                  
   494                                  ;  Sound Blaster DMA Driver v0.1b by Carlos Hasan.
   495                                  ;		July 24th, 1993.
   496                                  
   497                                  ; EQUATES
   498                                  
   499                                  ; 06/10/2017
   500                                  ;DmaBufSize 	equ	4096 ; 06/10/2017 
   501                                  ;DmaBufSize 	equ	2048 ; 06/10/2017
   502                                  DmaBufSize 	equ	65536 ; 12/03/2017
   503                                  
   504                                  ; MACROS
   505                                  
   506                                  %macro	SbOut	1
   507                                  %%Wait:
   508                                  	;in	al, dx
   509                                  	mov	ah, 0
   510                                  	int	34h
   511                                  	or	al, al
   512                                  	js	short %%Wait
   513                                  	mov	al, %1
   514                                  	;out	dx, al
   515                                  	mov	ah, 1
   516                                  	int	34h
   517                                  %endmacro
   518                                  
   519                                  ; CODE
   520                                  
   521                                  ;--------------------------------------------------------------------------
   522                                  ; SbIrqHandler:  Sound Blaster IRQ handler.
   523                                  ;--------------------------------------------------------------------------
   524                                  
   525                                  SbIrqHandler:	; SoundBlaster IRQ Callback service for TRDOS 386
   526                                  		; 03/03/2017
   527                                  
   528                                  		; 12/03/2017
   529                                  		; 11/03/2017
   530                                  
   531 00000373 668B15[0D0D0000]        		mov     dx, [SbAddr]
   532 0000037A 6683C20E                		add     dx, 0Eh
   533                                  		;in	al, dx
   534                                  		;mov	ah, 0
   535 0000037E 28E4                    		sub	ah, ah
   536 00000380 CD34                    		int	34h
   537                                  
   538                                  		;test	byte [flags], ENDOFFILE	; end of file flag
   539                                  		;jz	short a_3
   540                                  
   541                                  		;sub     dx, 02h ; 0Ch
   542                                  
   543                                  		; exit auto-initialize 8 bit transfer
   544                                  		;SbOut	0DAh ; exit auto-initialize transfer command
   545                                  		;jmp	short a_5
   546                                  
   547                                  a_3:
   548 00000382 30C0                    		xor	al, al ; 0
   549 00000384 A2[8D0F0000]            		mov	[iStatus], al
   550 00000389 3805[8C0F0000]          		cmp 	[DmaFlag], al
   551 0000038F 7702                    		ja	short a_4
   552 00000391 FEC0                    		inc	al
   553                                  a_4:
   554 00000393 A2[8C0F0000]            		mov 	[DmaFlag], al ; 
   555                                  a_5:
   556                                  		sys	_rele ; return from callback service
   556                              <1> 
   556                              <1> 
   556                              <1> 
   556                              <1> 
   556                              <1>  %if %0 >= 2
   556                              <1>  mov ebx, %2
   556                              <1>  %if %0 >= 3
   556                              <1>  mov ecx, %3
   556                              <1>  %if %0 = 4
   556                              <1>  mov edx, %4
   556                              <1>  %endif
   556                              <1>  %endif
   556                              <1>  %endif
   556 00000398 B827000000          <1>  mov eax, %1
   556                              <1> 
   556 0000039D CD40                <1>  int 40h
   557                                  
   558                                  ;--------------------------------------------------------------------------
   559                                  ; SbPoll:  Sound Blaster Polling.
   560                                  ;--------------------------------------------------------------------------
   561                                  
   562                                  SbPoll:
   563 0000039F 60                      		pushad
   564                                  		
   565                                  		; 11/03/2017
   566 000003A0 803D[8D0F0000]00        		cmp	byte [iStatus], 0
   567 000003A7 7721                    		ja	short Bye
   568                                  	
   569 000003A9 C605[8D0F0000]01        		mov	byte [iStatus], 1 ; 1 = set before interrupt
   570                                  			     ; (for preventing data load
   571                                  			     ; without an interrupt)	
   572                                  
   573                                  		;test	byte [flags], ENDOFFILE
   574                                  		;jnz	short sbPoll_stop
   575                                  
   576 000003B0 BF[00000100]            		mov     edi, DmaBuffer
   577 000003B5 BB00800000              		mov     ebx, DmaBufSize/2
   578                                  
   579 000003BA F605[8C0F0000]01        		test	byte [DmaFlag], 1
   580 000003C1 7402                    		jz	short FirstHalf
   581                                  SecondHalf:
   582 000003C3 01DF                    		add     edi, ebx
   583                                  FirstHalf:
   584 000003C5 E814080000              		call    GetSamples
   585                                  Bye:
   586 000003CA 61                      		popad
   587 000003CB C3                      		retn
   588                                  
   589                                  ;sbPoll_stop:	; 11/03/2017
   590                                  ;		; exit auto-initialize 8 bit transfer
   591                                  ;		SbOut	0DAh ; exit auto-initialize transfer command
   592                                  ;		;mov	byte [tLoop}, 0
   593                                  ;		jmp	short Bye
   594                                  
   595                                  ;--------------------------------------------------------------------------
   596                                  ; SbInit: Initializes the Sound Blaster Driver.
   597                                  ;--------------------------------------------------------------------------
   598                                  
   599                                  SbInit:
   600 000003CC 60                      		pushad
   601                                  
   602 000003CD E88B080000              		call    StartPlaying
   603                                  SetBuffer:
   604                                  		;mov	byte [DmaFlag], 0
   605 000003D2 8B1D[30860000]          		mov	ebx, [DMA_phy_buff] ; physical addr of DMA buff
   606 000003D8 B900000100              		mov     ecx, DmaBufSize
   607 000003DD 49                      		dec     ecx
   608                                  
   609                                  		; 8 bit DMA buffer setting (DMA channel 1)
   610 000003DE B005                    		mov     al, 05h ; set mask bit for channel 1  (4+1)
   611                                  		;out	0Ah, al
   612 000003E0 66BA0A00                		mov	dx, 0Ah ; DMA mask register
   613 000003E4 B401                    		mov	ah, 1  ;outb
   614 000003E6 CD34                    		int	34h
   615                                  
   616 000003E8 30C0                    		xor     al, al ; stops all DMA processes on selected channel
   617                                  		;out	0Ch, al
   618 000003EA B20C                    		mov	dl, 0Ch  ; clear selected channel register
   619                                  		;mov	ah, 1  ;outb
   620 000003EC CD34                    		int	34h
   621                                  
   622 000003EE 88D8                    		mov     al, bl	; byte 0 of DMA buffer address (physical)   
   623                                  		;out	02h, al
   624 000003F0 B202                    		mov	dl, 02h	; DMA channel 1 port number
   625                                  		;mov	ah, 1  ;outb
   626 000003F2 CD34                    		int	34h
   627                                  
   628 000003F4 88F8                    		mov     al, bh  ; byte 1 of DMA buffer address (physical)   
   629                                  		;out	02h, al
   630                                  		;mov	dl, 02h ; DMA channel 1 port number
   631                                  		;mov	ah, 1  ;outb
   632 000003F6 CD34                    		int	34h
   633                                  
   634 000003F8 C1EB10                  		shr	ebx, 16
   635                                  
   636 000003FB 88D8                    		mov     al, bl ; byte 2 of DMA buffer address (physical)   
   637                                  		;out	83h, al
   638 000003FD B283                    		mov	dl, 83h ; page register port addr for channel 1
   639                                  		;mov	ah, 1  ;outb
   640 000003FF CD34                    		int	34h
   641                                  
   642 00000401 88C8                    		mov     al, cl ; low byte of DMA count - 1
   643                                  		;out	03h, al
   644 00000403 B203                    		mov	dl, 03h ; count register port addr for channel 1
   645                                  		;mov	ah, 1  ;outb
   646 00000405 CD34                    		int	34h
   647                                  
   648 00000407 88E8                    		mov     al, ch ; high byte of DMA count - 1
   649                                  		;out	03h, al
   650                                  		;mov	dl, 03h ; count register port addr for channel 1
   651                                  		;mov	ah, 1  ;outb
   652 00000409 CD34                    		int	34h
   653                                  
   654                                  		; channel 1, read, autoinitialized, single mode
   655 0000040B B059                    		mov	al, 59h ; 06/10/2017
   656                                  		;mov	al, 49h ; 02/10/2017 
   657                                  		;out	0Bh, al
   658 0000040D B20B                    		mov	dl, 0Bh ; DMA mode register port address
   659                                  		;mov	ah, 1  ;outb
   660 0000040F CD34                    		int	34h
   661                                  
   662 00000411 B001                    		mov     al, 01h ; clear mask bit for channel 1
   663                                  		;out	0Ah, al
   664 00000413 B20A                    		mov	dl, 0Ah ; DMA mask register port address
   665                                  		;mov	ah, 1  ;outb
   666 00000415 CD34                    		int	34h
   667                                  ClearBuffer:
   668 00000417 BF[00000100]            		mov     edi, DmaBuffer	; virtual addr of DMA buff
   669                                  		;mov	ecx, DmaBufSize
   670 0000041C 41                      		inc	ecx
   671 0000041D B080                    		mov     al, 80h
   672                                  		;cld
   673 0000041F F3AA                    		rep     stosb
   674                                  SetIrq:
   675                                  		; CALLBACK method
   676 00000421 8A1D[0F0D0000]          		mov	bl, [SbIrq] ; IRQ number
   677 00000427 B702                    		mov	bh, 2 ; Link IRQ to user for callback service
   678 00000429 BA[73030000]            		mov	edx, SbIrqHandler
   679                                  		sys	_calbac 
   679                              <1> 
   679                              <1> 
   679                              <1> 
   679                              <1> 
   679                              <1>  %if %0 >= 2
   679                              <1>  mov ebx, %2
   679                              <1>  %if %0 >= 3
   679                              <1>  mov ecx, %3
   679                              <1>  %if %0 = 4
   679                              <1>  mov edx, %4
   679                              <1>  %endif
   679                              <1>  %endif
   679                              <1>  %endif
   679 0000042E B82C000000          <1>  mov eax, %1
   679                              <1> 
   679 00000433 CD40                <1>  int 40h
   680                                  		; SIGNAL RESPONSE BYTE method ; 04/03/2017
   681                                  		;mov	bl, [SbIrq]
   682                                  		;mov	bh, 1 ; Signal Response Byte method
   683                                  		;movzx	ecx, bl ; S.R.B. value = IRQ Number 
   684                                  		;mov	edx, SbSrb ; S.R.B. address
   685                                  		;sys	_calbac
   686                                  ResetDsp:
   687 00000435 668B15[0D0D0000]        		mov     dx, [SbAddr]
   688 0000043C 6683C206                		add     dx, 06h
   689 00000440 B001                    		mov     al, 1
   690                                  		;out	dx, al
   691 00000442 B401                    		mov	ah, 1  ;outb
   692 00000444 CD34                    		int	34h
   693                                  
   694                                  		;in	al, dx
   695                                  		;in	al, dx
   696                                  		;in	al, dx
   697                                  		;in	al, dx
   698                                  
   699 00000446 FECC                    		dec	ah ; ah = 0 ; inb
   700 00000448 CD34                    		int	34h		
   701                                  		;mov	ah, 0
   702 0000044A CD34                    		int	34h
   703                                  
   704 0000044C 30C0                    		xor     al, al
   705                                  		;out	dx, al
   706 0000044E FEC4                    		inc	ah ; ah = 1 ;outb
   707 00000450 CD34                    		int	34h
   708                                  
   709 00000452 66B96400                		mov     cx, 100
   710 00000456 28E4                    		sub	ah, ah ; 0
   711                                  WaitId:         
   712 00000458 668B15[0D0D0000]        		mov     dx, [SbAddr]
   713 0000045F 6683C20E                		add     dx, 0Eh
   714                                  		;in	al, dx
   715                                  		;mov	ah, 0  ;inb
   716 00000463 CD34                    		int	34h
   717 00000465 08C0                    		or      al, al
   718 00000467 7807                    		js      short sb_GetId
   719 00000469 E2ED                    		loop    WaitId
   720 0000046B E9B2000000              		jmp     sb_Exit
   721                                  sb_GetId:          
   722 00000470 668B15[0D0D0000]        		mov     dx, [SbAddr]
   723 00000477 6683C20A                		add     dx, 0Ah
   724                                  		;in	al, dx
   725                                  		;mov	ah, 0  ;inb
   726 0000047B CD34                    		int	34h
   727 0000047D 3CAA                    		cmp     al, 0AAh
   728 0000047F 7407                    		je      short SbOk
   729 00000481 E2D5                    		loop    WaitId
   730 00000483 E99A000000              		jmp	sb_Exit
   731                                  SbOk:
   732 00000488 668B15[0D0D0000]        		mov     dx, [SbAddr]
   733 0000048F 6683C20C                		add     dx, 0Ch
   734                                  		SbOut   0D1h
   734                              <1> %%Wait:
   734                              <1> 
   734 00000493 B400                <1>  mov ah, 0
   734 00000495 CD34                <1>  int 34h
   734 00000497 08C0                <1>  or al, al
   734 00000499 78F8                <1>  js short %%Wait
   734 0000049B B0D1                <1>  mov al, %1
   734                              <1> 
   734 0000049D B401                <1>  mov ah, 1
   734 0000049F CD34                <1>  int 34h
   735                                  
   736                                  		; 11/03/2017
   737                                  		SbOut   41h ; 8 bit or 16 bit transfer
   737                              <1> %%Wait:
   737                              <1> 
   737 000004A1 B400                <1>  mov ah, 0
   737 000004A3 CD34                <1>  int 34h
   737 000004A5 08C0                <1>  or al, al
   737 000004A7 78F8                <1>  js short %%Wait
   737 000004A9 B041                <1>  mov al, %1
   737                              <1> 
   737 000004AB B401                <1>  mov ah, 1
   737 000004AD CD34                <1>  int 34h
   738 000004AF 668B1D[8E0F0000]        		mov	bx, [sampling_rate]
   739                                  		SbOut	bh ; sampling rate high byte
   739                              <1> %%Wait:
   739                              <1> 
   739 000004B6 B400                <1>  mov ah, 0
   739 000004B8 CD34                <1>  int 34h
   739 000004BA 08C0                <1>  or al, al
   739 000004BC 78F8                <1>  js short %%Wait
   739 000004BE 88F8                <1>  mov al, %1
   739                              <1> 
   739 000004C0 B401                <1>  mov ah, 1
   739 000004C2 CD34                <1>  int 34h
   740                                  		SbOut	bl ; sampling rate low byte
   740                              <1> %%Wait:
   740                              <1> 
   740 000004C4 B400                <1>  mov ah, 0
   740 000004C6 CD34                <1>  int 34h
   740 000004C8 08C0                <1>  or al, al
   740 000004CA 78F8                <1>  js short %%Wait
   740 000004CC 88D8                <1>  mov al, %1
   740                              <1> 
   740 000004CE B401                <1>  mov ah, 1
   740 000004D0 CD34                <1>  int 34h
   741                                  		
   742                                  		; 22/04/2017
   743                                  		;mov	ah, 1
   744                                  		;mov	dx, [SbAddr]
   745                                  		;add	dx, 4 ; Mixer chip address port
   746 000004D2 6683EA08                		sub	dx, 0Ch-04h
   747 000004D6 B022                    		mov	al, 22h ; master volume
   748 000004D8 CD34                    		int	34h
   749 000004DA 6642                    		inc	dx
   750 000004DC B0FF                    		mov	al, 0FFh ; maximum volume level
   751 000004DE CD34                    		int	34h
   752 000004E0 6683C207                		add	dx, 0Ch-05h
   753                                  StartDma:  
   754                                  		;; autoinitialized 8 bit DMA transfer mode
   755                                  		;mov	bx, 0C6h ; 8 bit output (0C6h)
   756                                  		; PCM output (8 bit mono autoinitialized transfer)
   757                                  		;SbOut  bl ; bCommand
   758                                  		;SbOut	bh ; bMode
   759                                  		SbOut	0C6h ; bCommand (C6h = 8 bit autoinitialized)
   759                              <1> %%Wait:
   759                              <1> 
   759 000004E4 B400                <1>  mov ah, 0
   759 000004E6 CD34                <1>  int 34h
   759 000004E8 08C0                <1>  or al, al
   759 000004EA 78F8                <1>  js short %%Wait
   759 000004EC B0C6                <1>  mov al, %1
   759                              <1> 
   759 000004EE B401                <1>  mov ah, 1
   759 000004F0 CD34                <1>  int 34h
   760                                  		SbOut	0    ; bMode (0 = 8 bit mono)	
   760                              <1> %%Wait:
   760                              <1> 
   760 000004F2 B400                <1>  mov ah, 0
   760 000004F4 CD34                <1>  int 34h
   760 000004F6 08C0                <1>  or al, al
   760 000004F8 78F8                <1>  js short %%Wait
   760 000004FA B000                <1>  mov al, %1
   760                              <1> 
   760 000004FC B401                <1>  mov ah, 1
   760 000004FE CD34                <1>  int 34h
   761 00000500 66BB0080                		mov	bx, DmaBufSize / 2
   762 00000504 664B                    		dec	bx  ; wBlkSize is one less than the actual size 
   763                                  		SbOut	bl
   763                              <1> %%Wait:
   763                              <1> 
   763 00000506 B400                <1>  mov ah, 0
   763 00000508 CD34                <1>  int 34h
   763 0000050A 08C0                <1>  or al, al
   763 0000050C 78F8                <1>  js short %%Wait
   763 0000050E 88D8                <1>  mov al, %1
   763                              <1> 
   763 00000510 B401                <1>  mov ah, 1
   763 00000512 CD34                <1>  int 34h
   764                                  		SbOut	bh
   764                              <1> %%Wait:
   764                              <1> 
   764 00000514 B400                <1>  mov ah, 0
   764 00000516 CD34                <1>  int 34h
   764 00000518 08C0                <1>  or al, al
   764 0000051A 78F8                <1>  js short %%Wait
   764 0000051C 88F8                <1>  mov al, %1
   764                              <1> 
   764 0000051E B401                <1>  mov ah, 1
   764 00000520 CD34                <1>  int 34h
   765                                  sb_Exit:           
   766 00000522 61                      		popad
   767 00000523 C3                      		retn
   768                                  
   769                                  ;--------------------------------------------------------------------------
   770                                  ; SbDone:  Shut Down the Sound Blaster Driver.
   771                                  ;--------------------------------------------------------------------------
   772                                  
   773                                  SbDone:
   774 00000524 60                      		pushad
   775                                  
   776 00000525 8A1D[0F0D0000]          		mov     bl, [SbIrq] ; IRQ number
   777 0000052B 28FF                    		sub	bh, bh ; 0 = Unlink IRQ from user
   778                                  		sys	_calbac 
   778                              <1> 
   778                              <1> 
   778                              <1> 
   778                              <1> 
   778                              <1>  %if %0 >= 2
   778                              <1>  mov ebx, %2
   778                              <1>  %if %0 >= 3
   778                              <1>  mov ecx, %3
   778                              <1>  %if %0 = 4
   778                              <1>  mov edx, %4
   778                              <1>  %endif
   778                              <1>  %endif
   778                              <1>  %endif
   778 0000052D B82C000000          <1>  mov eax, %1
   778                              <1> 
   778 00000532 CD40                <1>  int 40h
   779                                  
   780 00000534 668B15[0D0D0000]        		mov     dx, [SbAddr]
   781 0000053B 6683C20C                		add     dx, 0Ch
   782                                  		SbOut   0D0h
   782                              <1> %%Wait:
   782                              <1> 
   782 0000053F B400                <1>  mov ah, 0
   782 00000541 CD34                <1>  int 34h
   782 00000543 08C0                <1>  or al, al
   782 00000545 78F8                <1>  js short %%Wait
   782 00000547 B0D0                <1>  mov al, %1
   782                              <1> 
   782 00000549 B401                <1>  mov ah, 1
   782 0000054B CD34                <1>  int 34h
   783                                  		SbOut   0D3h
   783                              <1> %%Wait:
   783                              <1> 
   783 0000054D B400                <1>  mov ah, 0
   783 0000054F CD34                <1>  int 34h
   783 00000551 08C0                <1>  or al, al
   783 00000553 78F8                <1>  js short %%Wait
   783 00000555 B0D3                <1>  mov al, %1
   783                              <1> 
   783 00000557 B401                <1>  mov ah, 1
   783 00000559 CD34                <1>  int 34h
   784                                  
   785 0000055B E8AC070000              		call    StopPlaying
   786                                  
   787 00000560 61                      		popad
   788 00000561 C3                      		retn
   789                                  
   790                                  ;=============================================================================
   791                                  ;               MODLOAD.ASM
   792                                  ;=============================================================================
   793                                  
   794                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   795                                  ;		July 10th, 1993.
   796                                  
   797                                  ; STRUCTURES
   798                                  
   799                                  struc ModSample
   800 00000000 <res 00000016>          .msName:	resb 22
   801 00000016 <res 00000002>          .msLength:	resw 1
   802 00000018 <res 00000001>          .msFinetune:	resb 1
   803 00000019 <res 00000001>          .msVolume:	resb 1
   804 0000001A <res 00000002>          .msRepeat:	resw 1
   805 0000001C <res 00000002>          .msRepLen:	resw 1
   806                                  .size:		; 30 bytes
   807                                  endstruc
   808                                  
   809                                  struc ModHeader
   810 00000000 <res 00000014>          .mhName:	resb 20
   811 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   812 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   813 000003B7 <res 00000001>          .mhReStart:	resb 1
   814 000003B8 <res 00000080>          .mhOrder:	resb 128
   815 00000438 <res 00000004>          .mhSign:	resw 2
   816                                  .size:		; 1084 bytes
   817                                  endstruc
   818                                  
   819                                  struc ModInfoRec
   820 00000000 <res 00000001>          .OrderLen:	resb 1
   821 00000001 <res 00000001>          .ReStart:	resb 1
   822 00000002 <res 00000080>          .Order:		resb 128
   823 00000082 <res 00000004>          .Patterns:	resd 1
   824 00000086 <res 0000003E>          .SampOfs:	resw 31
   825 000000C4 <res 0000003E>          .SampSeg:	resw 31
   826 00000102 <res 0000003E>          .SampLen:	resw 31
   827 00000140 <res 0000003E>          .SampRep:	resw 31
   828 0000017E <res 0000003E>          .SampRepLen:	resw 31
   829 000001BC <res 0000003E>          .SampVol:	resw 31
   830                                  .size:		; 506 bytes	
   831                                  endstruc
   832                                  
   833                                  ; 06/10/2017
   834                                  ; 04/10/2017
   835                                  ; /* MOD FileFormat */
   836                                  
   837                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   838                                  ID_FLT4 equ 34544C46h ; "FLT4"
   839                                  ID_8CHN equ 4E484338h ; "8CHN"
   840                                  ID_FLT8 equ 34544C46h ; "FLT8"
   841                                  
   842                                  ; CODE
   843                                  
   844                                  LoadModule:
   845                                  		; edi = file name address
   846                                  
   847 00000562 60                      		pushad
   848                                  
   849 00000563 E878010000              		call    ClearModInfo
   850                                  OpenFile:       
   851                                  		; ebx = ASCIIZ file name address
   852                                  		; ecx = open mode (0 = open for read)		
   853                                  		sys	_open, edi, 0 ; open for reading
   853                              <1> 
   853                              <1> 
   853                              <1> 
   853                              <1> 
   853                              <1>  %if %0 >= 2
   853 00000568 89FB                <1>  mov ebx, %2
   853                              <1>  %if %0 >= 3
   853 0000056A B900000000          <1>  mov ecx, %3
   853                              <1>  %if %0 = 4
   853                              <1>  mov edx, %4
   853                              <1>  %endif
   853                              <1>  %endif
   853                              <1>  %endif
   853 0000056F B805000000          <1>  mov eax, %1
   853                              <1> 
   853 00000574 CD40                <1>  int 40h
   854 00000576 0F8262010000            		jc	Failed
   855 0000057C A3[900F0000]            		mov     [FileHandle], eax
   856                                  ReadHeader:
   857                                  		; ebx = File handle
   858                                  		; ecx = Buffer address
   859                                  		; edx = Byte count
   860                                  		sys	_read, [FileHandle], Header, ModHeader.size
   860                              <1> 
   860                              <1> 
   860                              <1> 
   860                              <1> 
   860                              <1>  %if %0 >= 2
   860 00000581 8B1D[900F0000]      <1>  mov ebx, %2
   860                              <1>  %if %0 >= 3
   860 00000587 B9[940F0000]        <1>  mov ecx, %3
   860                              <1>  %if %0 = 4
   860 0000058C BA3C040000          <1>  mov edx, %4
   860                              <1>  %endif
   860                              <1>  %endif
   860                              <1>  %endif
   860 00000591 B803000000          <1>  mov eax, %1
   860                              <1> 
   860 00000596 CD40                <1>  int 40h
   861 00000598 0F8231010000            		jc      CloseFile
   862                                  CheckMK:  
   863                                  		; 04/10/2017
   864 0000059E A1[CC130000]            		mov	eax, [Header+ModHeader.mhSign]
   865                                        
   866 000005A3 3D4D2E4B2E              		cmp	eax, ID_MK   ; cmp eax, '.K.M'
   867                                  		;je	short Is4chnMod
   868 000005A8 742B                    		je	short IsModFile
   869                                  CheckFLT4:
   870 000005AA 3D464C5434              		cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   871                                  		;je	short Is4chnMod
   872 000005AF 7424                    		je	short IsModFile
   873                                  Check8CHN:
   874 000005B1 3D3843484E              		cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   875 000005B6 740D                    		je	short Is8chnMod
   876                                  CheckFLT8:
   877 000005B8 3D464C5434              		cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   878                                  		; 06/10/2017
   879 000005BD 7406                    		je	short Is8chnMod
   880 000005BF F9                      		stc
   881 000005C0 E90A010000              		jmp	CloseFile
   882                                  Is8chnMod:
   883 000005C5 C605[890F0000]08        		mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   884 000005CC C605[880F0000]0B        		mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   885 000005D3 EB00                    		jmp	short IsModFile
   886                                  ;Is4chnMod:
   887                                  ;		mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   888                                  ;		mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   889                                  
   890                                  IsModFile:
   891 000005D5 A0[4A130000]            		mov     al, [Header+ModHeader.mhOrderLen]
   892 000005DA A2[D0130000]            		mov     [ModInfo.OrderLen], al
   893                                  
   894 000005DF A0[4B130000]            		mov     al, [Header+ModHeader.mhReStart]
   895 000005E4 3A05[4A130000]          		cmp     al, [Header+ModHeader.mhOrderLen]
   896 000005EA 7202                    		jb      short SetReStart
   897 000005EC B07F                    		mov     al, 7Fh
   898                                  SetReStart:
   899 000005EE A2[D1130000]            		mov     [ModInfo.ReStart], al
   900                                  
   901                                  		;mov	ecx, 128
   902 000005F3 66B98000                		mov	cx, 128
   903 000005F7 31D2                    		xor     edx, edx
   904 000005F9 31DB                    		xor     ebx, ebx
   905                                  CopyOrder:
   906 000005FB 8AB3[4C130000]          		mov     dh, [Header+ModHeader.mhOrder+ebx]
   907 00000601 88B3[D2130000]          		mov     [ModInfo.Order+ebx], dh
   908 00000607 38D6                    		cmp     dh, dl
   909 00000609 7202                    		jb      short NextOrder
   910 0000060B 88F2                    		mov     dl, dh ; Max. pattern number ; 04/10/2017
   911                                  NextOrder:
   912 0000060D 43                      		inc     ebx
   913 0000060E E2EB                    		loop    CopyOrder
   914                                  AllocPatterns:  
   915 00000610 81E2FF000000            		and	edx, 0FFh
   916                                  		; 04/10/2017
   917                                  		;inx	dx  ; 12/03/2017
   918 00000616 FEC2                    		inc	dl
   919                                  		; dl = number of patterns (04/07/2017)
   920 00000618 8A0D[880F0000]          		mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   921 0000061E D3E2                    		shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   922                                  				     ; *2048 ; (byte count of patterns *64*8*4)
   923                                  		;
   924 00000620 89D5                    		mov	ebp, edx ; offset of samples (04/07/2017)
   925                                  		;mov	ecx, 10000h ; next 64K (4096*16)
   926 00000622 B9[00000200]            		mov	ecx, file_buffer ; 12/03/2017
   927                                  		;
   928 00000627 890D[52140000]          		mov	[ModInfo.Patterns], ecx
   929                                  		;
   930 0000062D 01CD                    		add	ebp, ecx ; next offset for samples
   931                                  ReadPatterns:  
   932                                  		;mov	ebx, [FileHandle] 
   933                                  		; ebx = File handle
   934                                  		; ecx = Buffer address
   935                                  		; edx = Byte count
   936                                  		sys	_read, [FileHandle]
   936                              <1> 
   936                              <1> 
   936                              <1> 
   936                              <1> 
   936                              <1>  %if %0 >= 2
   936 0000062F 8B1D[900F0000]      <1>  mov ebx, %2
   936                              <1>  %if %0 >= 3
   936                              <1>  mov ecx, %3
   936                              <1>  %if %0 = 4
   936                              <1>  mov edx, %4
   936                              <1>  %endif
   936                              <1>  %endif
   936                              <1>  %endif
   936 00000635 B803000000          <1>  mov eax, %1
   936                              <1> 
   936 0000063A CD40                <1>  int 40h
   937 0000063C 0F828D000000            		jc      CloseFile
   938                                  
   939                                  		; patterns have been loaded here... (04/07/2017)
   940                                  
   941 00000642 BE[A80F0000]            		mov	esi, Header+ModHeader.mhSamples
   942 00000647 31FF                    		xor     edi, edi
   943                                  CopySamples:
   944 00000649 668B4616                		mov     ax, [esi+ModSample.msLength]
   945 0000064D 86C4                    		xchg    al, ah
   946 0000064F 66D1E0                  		shl     ax, 1
   947 00000652 668987[D2140000]        		mov     [ModInfo.SampLen+edi], ax
   948 00000659 8A4619                  		mov     al, [esi+ModSample.msVolume]
   949 0000065C 30E4                    		xor     ah, ah
   950 0000065E 668987[8C150000]        		mov     [ModInfo.SampVol+edi], ax
   951 00000665 668B461A                		mov     ax, [esi+ModSample.msRepeat]
   952 00000669 86C4                    		xchg    al, ah
   953 0000066B 66D1E0                  		shl     ax, 1
   954 0000066E 668987[10150000]        		mov     [ModInfo.SampRep+edi], ax
   955 00000675 668B461C                		mov     ax, [esi+ModSample.msRepLen]
   956 00000679 86C4                    		xchg    al, ah
   957 0000067B 66D1E0                  		shl     ax, 1
   958 0000067E 668987[4E150000]        		mov     [ModInfo.SampRepLen+edi], ax
   959 00000685 83C61E                  		add     esi, ModSample.size
   960 00000688 6683C702                		add     di, 2
   961 0000068C 6683FF3E                		cmp     di, 2*31
   962 00000690 72B7                    		jb      short CopySamples
   963                                  
   964 00000692 31F6                    		xor     esi, esi
   965                                  AllocSamples:
   966 00000694 0FB796[D2140000]        		movzx	edx, word [ModInfo.SampLen+esi]
   967 0000069B 09D2                    		or	edx, edx ; byte count
   968 0000069D 7426                    		jz      short NextSample
   969 0000069F 89E8                    		mov	eax, ebp
   970 000006A1 668986[56140000]        		mov	[ModInfo.SampOfs+esi], ax
   971 000006A8 C1E810                  		shr	eax, 16
   972 000006AB 668986[94140000]        		mov	[ModInfo.SampSeg+esi], ax
   973 000006B2 89E9                    		mov	ecx, ebp
   974 000006B4 01D5                    		add	ebp, edx ; next offset for sample 
   975                                  ReadSample:
   976                                  		;mov	ebx, [FileHandle]
   977                                  		;movzx  edx, [ModInfo.SampLen+esi]
   978                                  		;mov    ecx, [ModInfo.SampOfs+esi]
   979                                  
   980                                  		; ebx = File handle
   981                                  		; ecx = Buffer address
   982                                  		; edx = Byte count
   983                                  		sys	_read, [FileHandle]
   983                              <1> 
   983                              <1> 
   983                              <1> 
   983                              <1> 
   983                              <1>  %if %0 >= 2
   983 000006B6 8B1D[900F0000]      <1>  mov ebx, %2
   983                              <1>  %if %0 >= 3
   983                              <1>  mov ecx, %3
   983                              <1>  %if %0 = 4
   983                              <1>  mov edx, %4
   983                              <1>  %endif
   983                              <1>  %endif
   983                              <1>  %endif
   983 000006BC B803000000          <1>  mov eax, %1
   983                              <1> 
   983 000006C1 CD40                <1>  int 40h
   984 000006C3 720A                    		jc      short CloseFile
   985                                  
   986                                  NextSample:
   987 000006C5 6683C602                		add     si, 2
   988 000006C9 6683FE3E                		cmp     si, 2*31
   989 000006CD 72C5                    		jb      short AllocSamples
   990                                  CloseFile:      
   991 000006CF 9C                      		pushf
   992                                  		sys	_close, [FileHandle]
   992                              <1> 
   992                              <1> 
   992                              <1> 
   992                              <1> 
   992                              <1>  %if %0 >= 2
   992 000006D0 8B1D[900F0000]      <1>  mov ebx, %2
   992                              <1>  %if %0 >= 3
   992                              <1>  mov ecx, %3
   992                              <1>  %if %0 = 4
   992                              <1>  mov edx, %4
   992                              <1>  %endif
   992                              <1>  %endif
   992                              <1>  %endif
   992 000006D6 B806000000          <1>  mov eax, %1
   992                              <1> 
   992 000006DB CD40                <1>  int 40h
   993 000006DD 9D                      		popf
   994                                  Failed:       
   995 000006DE 61                      		popad
   996 000006DF C3                      		retn
   997                                  
   998                                  FreeModule:
   999                                  		; Erdogan Tan (13/02/2017)
  1000                                  		; nothing to do here for memory de-allocation
  1001                                  ClearModInfo:
  1002 000006E0 57                      		push	edi
  1003 000006E1 BF[D0130000]            		mov	edi, ModInfo
  1004 000006E6 B9FA010000              		mov     ecx, ModInfoRec.size
  1005                                  		;cld
  1006 000006EB 30C0                    		xor     al, al
  1007 000006ED F3AA                    		rep     stosb
  1008 000006EF 5F                      		pop	edi
  1009 000006F0 C3                      		retn
  1010                                  
  1011                                  ;=============================================================================
  1012                                  ;               MODPLAY.ASM
  1013                                  ;=============================================================================
  1014                                  
  1015                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
  1016                                  ;		July 23th, 1993.
  1017                                  
  1018                                  ; EQUATES
  1019                                  
  1020                                  ;NumTracks	equ 4 ; 06/10/2017 ([numtracks])
  1021                                  DefTempo        equ 6
  1022                                  DefBpm          equ 125
  1023                                  MidCRate        equ 8448
  1024                                  MixBufSize      equ 4096
  1025                                  
  1026                                  ; STRUCTURES
  1027                                  
  1028                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
  1029 00000000 <res 00000004>          .Samples:	resd 1
  1030                                  ;.Position:	resw 1
  1031 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
  1032 00000008 <res 00000002>          .Len:		resw 1
  1033 0000000A <res 00000002>          .Repeat:	resw 1
  1034 0000000C <res 00000002>          .RepLen:	resw 1
  1035 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
  1036 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
  1037                                  ;.Error:	resb 1
  1038                                  ;.Reserved:	resb 1 ; 01/10/2017
  1039 00000010 <res 00000002>          .Period:	resw 1 ; Period
  1040 00000012 <res 00000002>          .Pitch:		resw 1 
  1041 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
  1042 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
  1043 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
  1044 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
  1045 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
  1046 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
  1047 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
  1048                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
  1049 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
  1050 0000001E <res 00000006>          .Arp:		resw 3
  1051 00000024 <res 00000002>          .ArpIndex:	resw 1
  1052                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
  1053                                  endstruc
  1054                                  
  1055                                  ; CODE
  1056                                  
  1057                                  ;--------------------------------------------------------------------------
  1058                                  ; updatechannel - update the track using the current effect
  1059                                  ;--------------------------------------------------------------------------
  1060                                  ; 
  1061                                  ;--------------------------------------------------------------------------
  1062                                  ; BeatTrack:  Process the next beat in one track.
  1063                                  ;  In:
  1064                                  ;    ds:di -  Track info Address.
  1065                                  ;--------------------------------------------------------------------------
  1066                                  
  1067                                  ; edi = Track info address
  1068                                  
  1069                                  updatechannel:
  1070                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
  1071                                  
  1072 000006F1 668B5714                		mov     dx, [edi+TrackInfo.Effect]
  1073                                  
  1074                                  		;test   dx, dx
  1075                                  		;je     short None
  1076                                  		;cmp    dh, 00h
  1077                                  		;je     short Arpeggio
  1078                                  		;cmp    dh, 01h
  1079                                  		;je     short PortUp
  1080                                  		;cmp    dh, 02h
  1081                                  		;je     short PortDown
  1082                                  		;cmp    dh, 03h
  1083                                  		;je     TonePort
  1084                                  		;cmp    dh, 04h
  1085                                  		;je     Vibrato
  1086                                  		;cmp    dh, 05h
  1087                                  		;je     PortSlide
  1088                                  		;cmp    dh, 06h
  1089                                  		;je     VibSlide
  1090                                  		;cmp    dh, 0Ah
  1091                                  		;je     VolSlide
  1092                                  		;retn
  1093                                  
  1094 000006F5 0FB6C6                  		movzx	eax, dh
  1095 000006F8 240F                    		and	al, 0Fh
  1096 000006FA FF2485[500D0000]        		jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
  1097                                  efxnull:
  1098                                  None:           
  1099 00000701 C3                      		retn
  1100                                  efxarpeggio2:
  1101                                  		; 01/10/2017
  1102 00000702 84D2                    		test    dl, dl
  1103 00000704 74FB                    		jz      short efxnull
  1104                                  Arpeggio:
  1105 00000706 0FB75F24                		movzx   ebx, word [edi+TrackInfo.ArpIndex]
  1106 0000070A 668B441F1E              		mov     ax, [edi+TrackInfo.Arp+ebx]
  1107 0000070F 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1108 00000713 6683C302                		add     bx, 2
  1109 00000717 6683FB06                		cmp     bx, 6
  1110 0000071B 7202                    		jb      short SetArpIndex
  1111 0000071D 31DB                    		xor     ebx, ebx
  1112                                  SetArpIndex:
  1113 0000071F 66895F24                		mov     [edi+TrackInfo.ArpIndex], bx
  1114 00000723 C3                      		retn
  1115                                  efxportaup:
  1116                                  PortUp:
  1117 00000724 30F6                    		xor     dh, dh
  1118                                  		;mov	bx, [edi+TrackInfo.Period]
  1119 00000726 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1120 0000072A 6629D3                  		sub     bx, dx
  1121                                  		;cmp	bx, 113
  1122 0000072D 6683FB1C                		cmp	bx, 28 ; 01/10/2017 
  1123 00000731 7D04                    		jge     short NotSmall
  1124                                  		;mov	bx, 113
  1125 00000733 66BB1C00                		mov	bx, 28 ; 01/10/2017
  1126                                  NotSmall:
  1127 00000737 66895F10                		mov     [edi+TrackInfo.Period], bx
  1128 0000073B 6601DB                  		add     bx, bx
  1129                                  		;mov	ax, [PitchTable+bx]
  1130 0000073E 668B83[CA150000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1131 00000745 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1132 00000749 C3                      		retn
  1133                                  efxportadown:
  1134                                  PortDown:
  1135 0000074A 30F6                    		xor     dh, dh
  1136                                  		;mov	bx, [edi+TrackInfo.Period]
  1137 0000074C 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1138 00000750 6601D3                  		add     bx, dx
  1139 00000753 6681FB600D              		cmp	bx, 3424 ; 01/10/2017 
  1140                                  		;cmp	bx, 856
  1141 00000758 7E04                    		jle     short NotBig
  1142                                  		;mov	bx, 856
  1143 0000075A 66BB600D                		mov	bx, 3424 ; 01/10/2017
  1144                                  NotBig:         
  1145 0000075E 66895F10                		mov     [edi+TrackInfo.Period], bx
  1146 00000762 6601DB                  		add     bx, bx
  1147                                  		;mov	ax, [PitchTable+bx]
  1148 00000765 668B83[CA150000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1149 0000076C 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1150 00000770 C3                      		retn
  1151                                  efxtoneporta2:
  1152                                  TonePort:
  1153 00000771 30F6                    		xor     dh, dh
  1154 00000773 668B4716                		mov     ax, [edi+TrackInfo.PortTo]
  1155                                  		;mov	bx, [edi+TrackInfo.Period]
  1156 00000777 0FB75F10                		movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1157 0000077B 6639C3                  		cmp     bx, ax
  1158 0000077E 7429                    		je      short NoPort
  1159 00000780 7F0D                    		jg      short PortToUp
  1160                                  PortToDown:     
  1161 00000782 6601D3                  		add     bx, dx
  1162 00000785 6639C3                  		cmp     bx, ax
  1163 00000788 7E0D                    		jle     short SetPort
  1164                                  FixPort:        
  1165 0000078A 6689C3                  		mov     bx, ax
  1166 0000078D EB08                    		jmp     short SetPort
  1167                                  PortToUp:
  1168 0000078F 6629D3                  		sub     bx, dx
  1169 00000792 6639C3                  		cmp     bx, ax
  1170 00000795 7CF3                    		jl      short FixPort
  1171                                  SetPort:        
  1172 00000797 66895F10                		mov     [edi+TrackInfo.Period], bx
  1173 0000079B 6601DB                  		add     bx, bx
  1174                                  		;mov	ax, [PitchTable+bx]
  1175 0000079E 668B83[CA150000]        		mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1176 000007A5 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1177                                  NoPort:         
  1178 000007A9 C3                      		retn
  1179                                  efxvibrato2:
  1180                                  		; 01/10/2017
  1181                                  Vibrato:
  1182 000007AA 88D6                    		mov     dh, dl
  1183                                  		;and	dl, 0Fh
  1184                                  		;shr	dh, 4
  1185                                  		;shl	dh, 2
  1186 000007AC 6681E20FF0              		and     dx, 0F00Fh
  1187 000007B1 C0EE02                  		shr     dh, 2
  1188                                  		;add	[edi+TrackInfo.VibPos], dh
  1189                                  		;mov	dh, [edi+TrackInfo.VibPos]
  1190                                  		;mov	bl, dh
  1191 000007B4 8A5F19                  		mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
  1192 000007B7 007719                  		add	[edi+TrackInfo.VibPos], dh
  1193 000007BA 88DE                    		mov	dh, bl ; 01/10/2017
  1194 000007BC C0EB02                  		shr     bl, 2
  1195                                  		;and	bx, 1Fh
  1196                                  		;mov	al, [SinTable+bx]
  1197 000007BF 83E31F                  		and	ebx, 1Fh
  1198 000007C2 8A83[380E0000]          		mov	al, [SinTable+ebx]
  1199 000007C8 F6E2                    		mul     dl
  1200                                  		;rol	ax, 1
  1201                                  		;xchg	al, ah
  1202                                  		;and	ah, 1
  1203 000007CA 66C1E807                		shr	ax, 7
  1204 000007CE 84F6                    		test    dh, dh
  1205 000007D0 7903                    		jns     short VibUp
  1206 000007D2 66F7D8                  		neg     ax
  1207                                  VibUp:          
  1208 000007D5 66034710                		add     ax, [edi+TrackInfo.Period]
  1209 000007D9 6689C3                  		mov	bx, ax
  1210                                  		;movzx	ebx, ax
  1211 000007DC 6683FB71                		cmp     bx, 113
  1212                                  		;cmp	bx, 113
  1213 000007E0 6683FB1C                		cmp	bx, 28  ; 01/10/2017
  1214 000007E4 7D06                    		jge     short NoLoVib
  1215                                  		;mov	bx, 113
  1216 000007E6 66BB1C00                		mov	bx, 28	; 01/10/2017
  1217 000007EA EB0B                    		jmp	short NoHiVib ; 01/10/2017	
  1218                                  NoLoVib:        
  1219 000007EC 6681FB600D              		cmp	bx, 3424 ; 01/10/2017 
  1220                                  		;cmp	bx, 856
  1221 000007F1 7E04                    		jle     short NoHiVib
  1222                                  		;mov	bx, 856
  1223 000007F3 66BB600D                		mov	bx, 3424 ; 01/10/2017
  1224                                  NoHiVib:        
  1225 000007F7 6601DB                  		add     bx, bx
  1226                                  		;mov	ax, [PitchTable+bx]
  1227 000007FA 668B83[CA150000]        		mov	ax, [PitchTable+ebx] ; 01/10/2017
  1228 00000801 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1229 00000805 C3                      		retn
  1230                                  efxtoneslide:
  1231                                  PortSlide:
  1232 00000806 E812000000              		call    VolSlide
  1233 0000080B 8A5718                  		mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1234 0000080E E95EFFFFFF              		jmp     TonePort  ; efxtoneporta2
  1235                                  efxvibslide:
  1236                                  VibSlide:
  1237 00000813 E805000000              		call    VolSlide
  1238 00000818 8A571A                  		mov     dl, [edi+TrackInfo.VibParm]
  1239 0000081B EB8D                    		jmp     short Vibrato  ; efxvibrato2
  1240                                  efxvolslide:
  1241                                  VolSlide:
  1242 0000081D 88D6                    		mov     dh, dl
  1243 0000081F 80E20F                  		and     dl, 0Fh
  1244 00000822 C0EE04                  		shr     dh, 4
  1245 00000825 8A470E                  		mov     al, [edi+TrackInfo.Volume]
  1246 00000828 28D0                    		sub     al, dl
  1247 0000082A 7D02                    		jge     short NoLoVol
  1248 0000082C 30C0                    		xor     al, al
  1249                                  NoLoVol:        
  1250 0000082E 00F0                    		add     al, dh
  1251 00000830 3C40                    		cmp     al, 64
  1252 00000832 7602                    		jbe     short NoHiVol
  1253 00000834 B040                    		mov     al, 64
  1254                                  NoHiVol:        
  1255 00000836 88470E                  		mov     [edi+TrackInfo.Volume], al
  1256 00000839 C3                      		retn
  1257                                  
  1258                                  efxtremolo2:
  1259                                  		; 01/10/2017 (TMODPLAY.ASM)
  1260                                  Tremolo:
  1261 0000083A 88D6                    		mov     dh, dl
  1262 0000083C 6681E20FF0              		and     dx, 0F00Fh
  1263 00000841 C0EE02                  		shr     dh, 2
  1264 00000844 8A5F1B                  		mov	bl, [edi+TrackInfo.TremPos]
  1265 00000847 00771B                  		add	[edi+TrackInfo.TremPos], dh
  1266 0000084A 88DE                    		mov	dh, bl
  1267 0000084C C0EB02                  		shr     bl, 2
  1268                                  		; 01/10/2017 - TRDOS 386
  1269                                  		;and	bx, 1Fh
  1270 0000084F 83E31F                  		and	ebx, 1Fh 
  1271                                  		;mov	al, [SinTable+bx]
  1272 00000852 8A83[380E0000]          		mov     al, [SinTable+ebx]
  1273 00000858 F6E2                    		mul     dl
  1274 0000085A 66C1E806                		shr	ax, 6
  1275 0000085E 84F6                    		test    dh, dh
  1276 00000860 7D03                    		jge	short Tremolo_1 ; efxtremolof2
  1277 00000862 66F7D8                  		neg     ax
  1278                                  efxtremolof2:
  1279                                  Tremolo_1:      
  1280 00000865 8A670E                  		mov	ah, [edi+TrackInfo.Volume]    
  1281 00000868 00E0                    		add     al, ah
  1282 0000086A 7D02                    		jge     short Tremolo_2 ; efxtremolof3
  1283 0000086C 30C0                    		xor     al, al
  1284                                  efxtremolof3:
  1285                                  Tremolo_2:       
  1286 0000086E 3C40                    		cmp     al, 64 ; 40h
  1287 00000870 7E02                    		jle     short Tremolo_3 ; efxtremolof4
  1288 00000872 B040                    		mov     al, 64 ; 40h
  1289                                  efxtremolof4:
  1290                                  Tremolo_3:       
  1291 00000874 28E0                    		sub	al, ah  ; ****** 
  1292 00000876 88470F                  		mov     [edi+TrackInfo.VolDiff], al
  1293 00000879 C3                      		retn	
  1294                                  
  1295                                  ;--------------------------------------------------------------------------
  1296                                  ; readchannel - read the next note event from the pattern sheet
  1297                                  ;--------------------------------------------------------------------------
  1298                                  ;
  1299                                  ;--------------------------------------------------------------------------
  1300                                  ; GetTrack:   Get the next Note from a pattern.
  1301                                  ;  In:
  1302                                  ;    ds:di -  Track info Address.
  1303                                  ;    es:si -  Pattern Note Address.
  1304                                  ; Out:
  1305                                  ;    es:si -  The Next Pattern Note address.
  1306                                  ;--------------------------------------------------------------------------
  1307                                  
  1308                                  ; esi = Pattern note address
  1309                                  ; edi = Track info address
  1310                                  
  1311                                  readchannel:
  1312                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1313 0000087A 66AD                    		lodsw
  1314 0000087C 86C4                    		xchg    al, ah
  1315 0000087E 88E3                    		mov	bl, ah
  1316 00000880 80E40F                  		and     ah, 0Fh
  1317 00000883 6689C1                  		mov     cx, ax
  1318 00000886 66AD                    		lodsw
  1319 00000888 86C4                    		xchg    al, ah
  1320 0000088A 88E7                    		mov     bh, ah
  1321 0000088C 80E40F                  		and     ah, 0Fh
  1322 0000088F 6689C2                  		mov     dx, ax
  1323 00000892 66895714                		mov     [edi+TrackInfo.Effect], dx
  1324                                  		; 01/10/2017 - TRDOS 386
  1325                                  		;and	bl, 0F0h
  1326 00000896 81E3F0FF0000            		and	ebx, 0FFF0h
  1327 0000089C C0EF04                  		shr     bh, 4
  1328 0000089F 08FB                    		or      bl, bh
  1329 000008A1 7446                    		je      short SetPeriod
  1330                                  SetSample:
  1331 000008A3 30FF                    		xor	bh, bh
  1332                                  		;and	ebx, 0FFh
  1333 000008A5 FECB                    		dec     bl
  1334 000008A7 01DB                    		add     ebx, ebx
  1335 000008A9 668B83[8C150000]        		mov     ax, [ModInfo.SampVol+ebx]
  1336 000008B0 88470E                  		mov     [edi+TrackInfo.Volume], al
  1337 000008B3 668B83[56140000]        		mov     ax, [ModInfo.SampOfs+ebx]
  1338 000008BA 668907                  		mov     [edi+TrackInfo.Samples], ax
  1339 000008BD 668B83[94140000]        		mov     ax, [ModInfo.SampSeg+ebx]
  1340 000008C4 66894702                		mov     [edi+TrackInfo.Samples+2], ax
  1341 000008C8 668B83[D2140000]        		mov     ax, [ModInfo.SampLen+ebx]
  1342 000008CF 66894708                		mov     [edi+TrackInfo.Len], ax
  1343 000008D3 668B83[10150000]        		mov     ax, [ModInfo.SampRep+ebx]
  1344 000008DA 6689470A                		mov     [edi+TrackInfo.Repeat], ax
  1345 000008DE 668B83[4E150000]        		mov     ax, [ModInfo.SampRepLen+ebx]
  1346 000008E5 6689470C                		mov     [edi+TrackInfo.RepLen], ax
  1347                                  SetPeriod:      
  1348 000008E9 6685C9                  		test    cx, cx
  1349 000008EC 7425                    		jz      short SetEffect
  1350                                  
  1351 000008EE 66894F16                		mov     [edi+TrackInfo.PortTo], cx ; *
  1352                                  		
  1353 000008F2 80FE03                  		cmp     dh, 03h
  1354                                  		;je	short SetEffect
  1355 000008F5 7428                    		je	short efxtoneporta ; 01/10/2017
  1356                                  
  1357 000008F7 66894F10                		mov     [edi+TrackInfo.Period], cx
  1358                                  		;movzx	ebx, cx
  1359 000008FB 6689CB                  		mov     bx, cx
  1360 000008FE 6601DB                  		add     bx, bx
  1361                                  		;mov	ax, [PitchTable+bx]
  1362 00000901 668B83[CA150000]        		mov	ax, [PitchTable+ebx] ; 01/10/2017
  1363 00000908 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1364 0000090C C7470400000000          		mov     dword [edi+TrackInfo.Position], 0
  1365                                  SetEffect:
  1366                                  		;test	dx, dx
  1367                                  		;je	short InitNone
  1368                                  		;cmp	dh, 00h
  1369                                  		;je	InitArpeggio
  1370                                  		;cmp	dh, 03h
  1371                                  		;je	short InitTonePort
  1372                                  		;cmp	dh, 04h
  1373                                  		;je	short InitVibrato
  1374                                  		;cmp	dh, 09h
  1375                                  		;je	short SampleOfs
  1376                                  		;cmp	dh, 0Bh
  1377                                  		;je	short PosJump
  1378                                  		;cmp	dh, 0Ch
  1379                                  		;je	short SetVolume
  1380                                  		;cmp	dh, 0Dh
  1381                                  		;je	short Break
  1382                                  		;cmp	dh, 0Fh
  1383                                  		;je	SetSpeed
  1384                                  		;retn
  1385                                  
  1386                                  		; 01/10/2017 (TMODPLAY.ASM)
  1387                                  		
  1388                                  		; dx = [di+TrackInfo.Effect]
  1389                                  		
  1390 00000913 0FB6C6                  		movzx	eax, dh
  1391 00000916 240F                    		and	al, 0Fh
  1392 00000918 FF2485[100D0000]        		jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1393                                  ;efxnull:
  1394                                  ;InitNone:
  1395                                  ;		retn
  1396                                  efxtoneporta:
  1397                                  		; 01/10/2017
  1398                                  		; cx = period
  1399                                  		;mov	[edi+TrackInfo.PortTo], cx ; *
  1400                                  InitTonePort:
  1401 0000091F 84D2                    		test    dl, dl
  1402 00000921 7503                    		jnz     short SetPortParm
  1403 00000923 8A5718                  		mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1404                                  SetPortParm:    
  1405 00000926 885718                  		mov     [edi+TrackInfo.PortParm], dl
  1406 00000929 66895714                		mov     [edi+TrackInfo.Effect], dx
  1407 0000092D C3                      		retn
  1408                                  efxvibrato:
  1409                                  InitVibrato:
  1410 0000092E 8A471A                  		mov     al, [edi+TrackInfo.VibParm]
  1411 00000931 88C4                    		mov     ah, al
  1412                                  		;and	al, 0Fh
  1413                                  		;and	ah, 0F0h
  1414 00000933 66250FF0                		and	ax, 0F00Fh
  1415 00000937 F6C20F                  		test    dl, 0Fh
  1416 0000093A 7502                    		jne     short OkDepth
  1417 0000093C 08C2                    		or      dl, al
  1418                                  OkDepth:        
  1419 0000093E F6C2F0                  		test    dl, 0F0h
  1420 00000941 7502                    		jnz     short OkRate
  1421 00000943 08E2                    		or      dl, ah
  1422                                  OkRate:         
  1423 00000945 88571A                  		mov     [edi+TrackInfo.VibParm], dl
  1424 00000948 66895714                		mov     [edi+TrackInfo.Effect], dx
  1425 0000094C 6685C9                  		test    cx, cx
  1426 0000094F 7404                    		jz      short OkPos
  1427 00000951 C6471900                		mov     byte [edi+TrackInfo.VibPos], 0
  1428                                  OkPos:          
  1429 00000955 C3                      		retn
  1430                                  efxsampoffset:
  1431                                  		; 01/10/2017 ; *******
  1432                                  SampleOfs:         
  1433                                  ;		test    dl, dl
  1434                                  ;		jnz     short SetSampleOfs
  1435                                  ;		mov     dl, [edi+TrackInfo.OldSampOfs]
  1436                                  ;SetSampleOfs:
  1437                                  ;		mov     [edi+TrackInfo.OldSampOfs], dl
  1438 00000956 88D6                    		mov     dh, dl
  1439 00000958 81E200FF0000            		and 	edx, 0FF00h ; 05/03/2017
  1440 0000095E 895704                  		mov     [edi+TrackInfo.Position], edx
  1441 00000961 C3                      		retn
  1442                                  efxpattjump:
  1443                                  PosJump:
  1444 00000962 8815[8C810000]          		mov     [OrderPos], dl
  1445 00000968 C605[90810000]40        		mov     byte [Row], 64
  1446 0000096F C3                      		retn
  1447                                  efxsetvolume:
  1448                                  SetVolume:
  1449 00000970 80FA40                  		cmp     dl, 64
  1450 00000973 7602                    		jbe     short OkVol
  1451 00000975 B240                    		mov     dl, 64
  1452                                  OkVol:
  1453                                  		; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1454 00000977 30F6                    		xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1455                                  		;mov	[edi+TrackInfo.Volume], dl
  1456 00000979 6689570E                		mov	[edi+TrackInfo.Volume], dx 
  1457 0000097D C3                      		retn
  1458                                  efxbreak:
  1459                                  Break:
  1460 0000097E 88D6                    		mov     dh, dl
  1461 00000980 80E20F                  		and     dl, 0Fh
  1462 00000983 C0EE04                  		shr     dh, 4
  1463 00000986 00F6                    		add     dh, dh
  1464 00000988 00F2                    		add     dl, dh
  1465 0000098A C0E602                  		shl     dh, 2
  1466 0000098D 00F2                    		add     dl, dh
  1467 0000098F 8815[91810000]          		mov     [BreakRow], dl
  1468 00000995 C605[90810000]40        		mov     byte [Row], 64
  1469 0000099C C3                      		retn
  1470                                  efxsetspeed:
  1471                                  SetSpeed:
  1472 0000099D 84D2                    		test    dl,dl
  1473 0000099F 7432                    		je      Skip
  1474 000009A1 80FA1F                  		cmp     dl,31
  1475 000009A4 770D                    		ja      short SetBpm
  1476                                  SetTempo:       
  1477 000009A6 8815[8D810000]          		mov     [Tempo], dl
  1478 000009AC 8815[8E810000]          		mov     [TempoWait], dl
  1479 000009B2 C3                      		retn
  1480                                  SetBpm:
  1481 000009B3 8815[8F810000]          		mov     [Bpm], dl
  1482 000009B9 B067                    		mov     al, 103
  1483 000009BB F6E2                    		mul     dl
  1484 000009BD 88E3                    		mov     bl, ah
  1485 000009BF 30FF                    		xor     bh, bh
  1486 000009C1 66A1[8E0F0000]          		mov     ax, [MixSpeed]
  1487 000009C7 6631D2                  		xor     dx, dx
  1488 000009CA 66F7F3                  		div     bx
  1489 000009CD 66A3[92810000]          		mov     [BpmSamples], ax
  1490                                  Skip:           
  1491 000009D3 C3                      		retn
  1492                                  efxarpeggio:
  1493                                  		; 01/10/2017
  1494 000009D4 84D2                    		test    dl, dl
  1495                                  		;je	efxnull
  1496 000009D6 74FB                    		je	short Skip
  1497                                  InitArpeggio:
  1498 000009D8 88D6                    		mov     dh, dl
  1499 000009DA 80E20F                  		and     dl, 0Fh
  1500 000009DD C0EE04                  		shr     dh, 4
  1501                                  		; 01/10/2017
  1502                                  		;mov	cx, 36
  1503 000009E0 66B95400                		mov	cx, 84 ; 84 notes/periods
  1504 000009E4 31DB                    		xor     ebx, ebx
  1505 000009E6 668B4710                		mov     ax, [edi+TrackInfo.Period]
  1506                                  gt_ScanPeriod:
  1507                                  		;cmp	ax, [PeriodTable+bx]
  1508 000009EA 663B83[900D0000]        		cmp	ax, [PeriodTable+ebx]
  1509 000009F1 7306                    		jae     short SetArp
  1510 000009F3 6683C302                		add     bx, 2
  1511 000009F7 E2F1                    		loop    gt_ScanPeriod
  1512                                  SetArp:         
  1513 000009F9 6601D2                  		add     dx, dx
  1514 000009FC 00DE                    		add     dh, bl
  1515 000009FE 00DA                    		add     dl, bl
  1516                                  		; 01/10/2017
  1517                                  		;mov	bx, [PeriodTable+bx]
  1518 00000A00 668B9B[900D0000]        		mov	bx, [PeriodTable+ebx]
  1519                                  		;add	bx, bx
  1520 00000A07 01DB                    		add	ebx, ebx
  1521                                  		;mov	ax, [PitchTable+bx]
  1522 00000A09 668B83[CA150000]        		mov	ax, [PitchTable+ebx]
  1523 00000A10 6689471E                		mov     [edi+TrackInfo.Arp], ax
  1524 00000A14 88F3                    		mov     bl, dh
  1525 00000A16 30FF                    		xor     bh, bh
  1526 00000A18 668B9B[900D0000]        		mov	bx, [PeriodTable+ebx]
  1527                                  		;add	bx, bx
  1528 00000A1F 01DB                    		add	ebx, ebx
  1529                                  		;mov	ax, [PitchTable+bx]
  1530 00000A21 668B83[CA150000]        		mov	ax, [PitchTable+ebx]
  1531 00000A28 66894720                		mov     [edi+TrackInfo.Arp+2], ax
  1532 00000A2C 88D3                    		mov     bl, dl
  1533 00000A2E 30FF                    		xor     bh, bh
  1534 00000A30 668B9B[900D0000]        		mov	bx, [PeriodTable+ebx]
  1535                                  		;add	bx, bx
  1536 00000A37 01DB                    		add	ebx, ebx
  1537                                  		;mov	ax, [PitchTable+bx]
  1538 00000A39 668B83[CA150000]        		mov	ax, [PitchTable+ebx]
  1539 00000A40 66894722                		mov     [edi+TrackInfo.Arp+4], ax
  1540 00000A44 66C747240000            		mov     word [edi+TrackInfo.ArpIndex], 0
  1541 00000A4A C3                      		retn
  1542                                  
  1543                                  efxtremolo:
  1544                                  		; 01/10/2017 (TMODPLAY.ASM)
  1545                                  InitTremolo:
  1546 00000A4B 8A471C                  		mov     al, [edi+TrackInfo.TremParm]
  1547 00000A4E 88C4                    		mov     ah, al
  1548 00000A50 66250FF0                		and     ax, 0F00Fh
  1549 00000A54 F6C20F                  		test    dl, 0Fh
  1550 00000A57 7502                    		jnz     short InitTremolo_1 ; efxtremolof0
  1551 00000A59 08C2                    		or      dl, al
  1552                                  efxtremolof0:
  1553                                  InitTremolo_1: 
  1554 00000A5B F6C2F0                  		test    dl, 0F0h
  1555 00000A5E 7502                    		jnz     short InitTremolo_2 ; efxtremolof1
  1556 00000A60 08E2                    		or      dl, ah
  1557                                  efxtremolof1:
  1558                                  InitTremolo_2:
  1559 00000A62 88571C                  		mov     [edi+TrackInfo.TremParm], dl
  1560 00000A65 66895714                		mov     [edi+TrackInfo.Effect], dx
  1561 00000A69 C3                      		retn
  1562                                  
  1563                                  ;--------------------------------------------------------------------------
  1564                                  ; pollmodule - polls the module player
  1565                                  ;--------------------------------------------------------------------------
  1566                                  ;--------------------------------------------------------------------------
  1567                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1568                                  ;--------------------------------------------------------------------------
  1569                                  
  1570                                  pollmodule:
  1571                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1572 00000A6A FE0D[8E810000]          		dec     byte [TempoWait]
  1573 00000A70 7417                    		jz      short GetTracks
  1574                                  
  1575                                  		;mov	ecx, NumTracks
  1576 00000A72 0FB70D[890F0000]        		movzx	ecx, word [numtracks] ; 06/10/2017
  1577 00000A79 BF[34860000]            		mov	edi, Tracks
  1578                                  BeatTracks:
  1579 00000A7E E86EFCFFFF              		call	BeatTrack	
  1580 00000A83 83C726                  		add	edi, TrackInfo.size
  1581 00000A86 E2F6                    		loop	BeatTracks
  1582 00000A88 C3                      		retn
  1583                                  GetTracks:
  1584 00000A89 A0[8D810000]            		mov     al, [Tempo]
  1585 00000A8E A2[8E810000]            		mov     [TempoWait], al
  1586                                  
  1587 00000A93 8B35[9E810000]          		mov	esi, [Note]
  1588 00000A99 803D[90810000]40        		cmp     byte [Row], 64
  1589 00000AA0 7268                    		jb      short NoPattWrap
  1590                                  
  1591 00000AA2 8B35[52140000]          		mov	esi, [ModInfo.Patterns]
  1592 00000AA8 8A1D[8C810000]          		mov     bl, [OrderPos]
  1593 00000AAE 3A1D[D0130000]          		cmp     bl, [ModInfo.OrderLen]
  1594 00000AB4 7214                    		jb      short NoOrderWrap
  1595 00000AB6 8A1D[D1130000]          		mov     bl, [ModInfo.ReStart]
  1596 00000ABC 881D[8C810000]          		mov     [OrderPos], bl
  1597 00000AC2 3A1D[D0130000]          		cmp     bl, [ModInfo.OrderLen]
  1598 00000AC8 7364                    		jae     short NoUpdate
  1599                                  NoOrderWrap:    
  1600                                  		;xor	bh, bh
  1601 00000ACA 81E3FF000000            		and	ebx, 0FFh
  1602 00000AD0 8A9B[D2130000]          		mov     bl, [ModInfo.Order+ebx]
  1603                                  		; 05/10/2017
  1604                                  		;shl	ebx, 10 ; *1024
  1605 00000AD6 8A0D[880F0000]          		mov	cl, [pattern_shift] ; 10 or 11
  1606 00000ADC D3E3                    		shl	ebx, cl ; *1024 or *2048
  1607                                  		;
  1608 00000ADE 01DE                    		add     esi, ebx
  1609 00000AE0 8A1D[91810000]          		mov     bl, [BreakRow]
  1610 00000AE6 881D[90810000]          		mov     [Row], bl
  1611                                  		;xor	bh, bh
  1612 00000AEC 81E3FF000000            		and	ebx, 0FFh
  1613 00000AF2 883D[91810000]          		mov     [BreakRow], bh ; 0
  1614 00000AF8 66C1E304                		shl     bx, 4
  1615 00000AFC 01DE                    		add     esi, ebx
  1616 00000AFE 8935[9E810000]          		mov     [Note], esi
  1617 00000B04 FE05[8C810000]          		inc     byte [OrderPos]
  1618                                  NoPattWrap:     
  1619 00000B0A FE05[90810000]          		inc     byte [Row]
  1620                                  
  1621                                  		;cld
  1622                                  		;mov	ecx, NumTracks
  1623 00000B10 0FB70D[890F0000]        		movzx	ecx, word [numtracks] ; 06/10/2017
  1624 00000B17 BF[34860000]            		mov	edi, Tracks
  1625                                  GetTracks_next:
  1626 00000B1C 51                      		push	ecx		
  1627 00000B1D E858FDFFFF              		call	GetTrack ; readchannel
  1628 00000B22 59                      		pop	ecx
  1629 00000B23 83C726                  		add	edi, TrackInfo.size
  1630 00000B26 E2F4                    		loop	GetTracks_next
  1631                                  
  1632 00000B28 8935[9E810000]          		mov     [Note], esi
  1633                                  NoUpdate:
  1634 00000B2E C3                      		retn
  1635                                  
  1636                                  ;--------------------------------------------------------------------------
  1637                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1638                                  ;  In:
  1639                                  ;   ds:si -  Track Info Address.
  1640                                  ;   ds:di -  Buffer Address.
  1641                                  ;    cx   -  Buffer Size.
  1642                                  ;--------------------------------------------------------------------------
  1643                                  
  1644                                  ; esi = Track info address
  1645                                  ; edi = Buffer address
  1646                                  ; ecx = Buffer size
  1647                                  
  1648                                  MixTrack:
  1649 00000B2F 66837E0C02              		cmp     word [esi+TrackInfo.RepLen], 2
  1650 00000B34 7752                    		ja      short MixLooped
  1651                                  MixNonLooped:   
  1652 00000B36 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1653 00000B38 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1654 00000B3B 0FB76E08                		movzx   ebp, word [esi+TrackInfo.Len]
  1655 00000B3F 52                      		push    edx
  1656 00000B40 56                      		push    esi
  1657 00000B41 01D3                    		add     ebx, edx
  1658 00000B43 01D5                    		add     ebp, edx
  1659 00000B45 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1660                                  		; 01/10/2017
  1661                                  		;mov	al, [esi+TrackInfo.Volume]
  1662 00000B49 668B460E                		mov	ax, [esi+TrackInfo.Volume]
  1663                                  		; ah = [esi+TrackInfo.VolDiff]
  1664 00000B4D 00E0                    		add	al, ah ; ****** 
  1665 00000B4F C6460F00                		mov	byte [esi+TrackInfo.VolDiff], 0
  1666 00000B53 8A661D                  		mov     ah, [esi+TrackInfo.Error]
  1667 00000B56 89DE                    		mov     esi, ebx
  1668 00000B58 31DB                    		xor	ebx, ebx ; 01/10/2017 ; *
  1669 00000B5A 88C7                    		mov     bh, al
  1670 00000B5C 88D0                    		mov     al, dl
  1671 00000B5E 88F2                    		mov     dl, dh
  1672                                  		;xor	dh, dh
  1673 00000B60 81E2FF000000            		and	edx, 0FFh
  1674                                  nlMixSamp:      
  1675 00000B66 39EE                    		cmp     esi, ebp
  1676 00000B68 7311                    		jae     short nlMixBye
  1677 00000B6A 8A1E                    		mov     bl, [esi]
  1678                                  		;mov	bl, [VolTable+bx]
  1679 00000B6C 8A9B[8C300000]          		mov	bl, [VolTable+ebx] ; 01/10/2017 ; *		
  1680 00000B72 001F                    		add     [edi], bl
  1681 00000B74 47                      		inc     edi
  1682 00000B75 00C4                    		add     ah, al
  1683 00000B77 11D6                    		adc     esi, edx
  1684 00000B79 E2EB                    		loop    nlMixSamp
  1685                                  nlMixBye:       
  1686 00000B7B 89F3                    		mov     ebx, esi
  1687 00000B7D 5E                      		pop     esi
  1688 00000B7E 5A                      		pop     edx
  1689 00000B7F 29D3                    		sub     ebx, edx
  1690 00000B81 895E04                  		mov     [esi+TrackInfo.Position], ebx
  1691 00000B84 88661D                  		mov     [esi+TrackInfo.Error], ah
  1692 00000B87 C3                      		retn
  1693                                  MixLooped:
  1694 00000B88 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1695 00000B8A 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1696 00000B8D 0FB76E0C                		movzx	ebp, word [esi+TrackInfo.RepLen]
  1697 00000B91 892D[9A810000]          		mov     [BufRep], ebp
  1698 00000B97 036E0A                  		add     ebp, [esi+TrackInfo.Repeat]
  1699 00000B9A 52                      		push    edx
  1700 00000B9B 56                      		push    esi
  1701 00000B9C 01D3                    		add     ebx, edx
  1702 00000B9E 01D5                    		add     ebp, edx
  1703 00000BA0 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1704                                  		; 01/10/2017
  1705                                  		;mov	al, [esi+TrackInfo.Volume]
  1706 00000BA4 668B460E                		mov	ax, [esi+TrackInfo.Volume]
  1707                                  		; ah = [esi+TrackInfo.VolDiff]
  1708 00000BA8 00E0                    		add	al, ah ; ****** 
  1709 00000BAA C6460F00                		mov	byte [esi+TrackInfo.VolDiff], 0
  1710 00000BAE 8A661D                  		mov     ah, [esi+TrackInfo.Error]
  1711                                  		;mov	si, bx
  1712 00000BB1 89DE                    		mov	esi, ebx ; 04/09/2017
  1713 00000BB3 31DB                    		xor	ebx, ebx ; 01/10/2017 ; *
  1714 00000BB5 88C7                    		mov     bh, al
  1715 00000BB7 88D0                    		mov     al, dl
  1716 00000BB9 88F2                    		mov     dl, dh
  1717                                  		;xor	dh, dh
  1718 00000BBB 81E2FF000000            		and	edx, 0FFh
  1719                                  lpMixSamp:      
  1720 00000BC1 39EE                    		cmp     esi, ebp
  1721 00000BC3 7206                    		jb      short lpMixNow
  1722 00000BC5 2B35[9A810000]          		sub     esi, [BufRep]
  1723                                  lpMixNow:       
  1724 00000BCB 8A1E                    		mov     bl, [esi]
  1725                                  		;mov	bl, [VolTable+bx]
  1726 00000BCD 8A9B[8C300000]          		mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1727 00000BD3 001F                    		add     [edi], bl
  1728 00000BD5 47                      		inc     edi
  1729 00000BD6 00C4                    		add     ah, al
  1730 00000BD8 11D6                    		adc	esi, edx
  1731 00000BDA E2E5                    		loop    lpMixSamp
  1732                                  lpMixBye:       
  1733                                  ;		mov     ebx, esi
  1734                                  ;		pop     esi
  1735                                  ;		pop     edx
  1736                                  ;		sub     ebx, edx
  1737                                  ;		mov     [esi+TrackInfo.Position], ebx
  1738                                  ;		mov     [esi+TrackInfo.Error], ah
  1739                                  ;		retn
  1740 00000BDC EB9D                    		jmp	short nlMixBye
  1741                                  
  1742                                  ;--------------------------------------------------------------------------
  1743                                  ; mixpoll - updates the output buffer
  1744                                  ;--------------------------------------------------------------------------
  1745                                  ;
  1746                                  ;--------------------------------------------------------------------------
  1747                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1748                                  ;  In:
  1749                                  ;    Buffer  - Buffer Address.
  1750                                  ;    Count   - Buffer Size.
  1751                                  ;--------------------------------------------------------------------------
  1752                                  
  1753                                  mixpoll:
  1754                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1755                                  		; edi = buffer address
  1756                                  		; ebx = count
  1757                                  
  1758 00000BDE 60                      		pushad
  1759                                  
  1760                                  		;cld
  1761                                  NextChunk:      
  1762 00000BDF 66833D[98810000]00      		cmp     word [BufLen], 0
  1763 00000BE7 754A                    		jne     short CopyChunk
  1764                                  
  1765 00000BE9 53                      		push    ebx
  1766 00000BEA 57                      		push    edi
  1767                                  MixChunk:       
  1768 00000BEB BF[8C710000]            		mov	edi, MixBuffer
  1769 00000BF0 0FB70D[92810000]        		movzx	ecx, word [BpmSamples]
  1770                                  		;mov	cx, [BpmSamples]
  1771 00000BF7 893D[94810000]          		mov     [BufPtr], edi
  1772 00000BFD 66890D[98810000]        		mov     [BufLen], cx
  1773                                  
  1774 00000C04 B080                    		mov     al, 80h
  1775 00000C06 F3AA                    		rep     stosb
  1776                                  
  1777                                  		;mov	cx, NumTracks
  1778                                  		;mov	cl, NumTracks ; 01/10/2017
  1779 00000C08 8A0D[890F0000]          		mov	cl, [numtracks] ; 06/10/2017
  1780 00000C0E BE[0E860000]            		mov	esi, Tracks - TrackInfo.size
  1781                                  GetSamples_next:
  1782 00000C13 51                      		push	ecx
  1783 00000C14 83C626                  		add	esi, TrackInfo.size
  1784 00000C17 668B0D[98810000]        		mov	cx, [BufLen]
  1785 00000C1E 8B3D[94810000]          		mov	edi, [BufPtr]
  1786 00000C24 E806FFFFFF              		call	MixTrack
  1787 00000C29 59                      		pop	ecx
  1788 00000C2A E2E7                    		loop	GetSamples_next		
  1789                                  
  1790 00000C2C E839FEFFFF              		call    UpdateTracks
  1791                                  
  1792 00000C31 5F                      		pop     edi
  1793 00000C32 5B                      		pop     ebx
  1794                                  CopyChunk:      
  1795                                  		;mov	cx, [BufLen]
  1796 00000C33 0FB70D[98810000]        		movzx	ecx, word [BufLen]
  1797 00000C3A 39D9                    		cmp	ecx, ebx
  1798                                  		;cmp	cx, bx
  1799 00000C3C 7602                    		jbe     short MoveChunk
  1800                                  		;mov	cx, bx
  1801 00000C3E 89D9                    		mov     ecx, ebx
  1802                                  MoveChunk:
  1803 00000C40 8B35[94810000]          		mov     esi, [BufPtr]
  1804 00000C46 010D[94810000]          		add     [BufPtr], ecx
  1805 00000C4C 66290D[98810000]        		sub     [BufLen], cx
  1806 00000C53 29CB                    		sub     ebx, ecx
  1807 00000C55 F3A4                    		rep     movsb
  1808 00000C57 85DB                    		test    ebx, ebx
  1809 00000C59 7584                    		jnz     short NextChunk
  1810                                  
  1811 00000C5B 61                      		popad
  1812 00000C5C C3                      		retn
  1813                                  
  1814                                  ;--------------------------------------------------------------------------
  1815                                  ; StartPlaying: Initializes the Sound System.
  1816                                  ;  In:
  1817                                  ;   Module Information Resources.
  1818                                  ;--------------------------------------------------------------------------
  1819                                  
  1820                                  StartPlaying:
  1821 00000C5D 60                      		pushad
  1822                                  SetModParms:    
  1823 00000C5E C605[8C810000]00        		mov     byte [OrderPos], 0
  1824 00000C65 C605[8D810000]06        		mov     byte [Tempo], DefTempo
  1825 00000C6C C605[8E810000]06        		mov     byte [TempoWait], DefTempo
  1826 00000C73 C605[8F810000]7D        		mov     byte [Bpm], DefBpm
  1827 00000C7A C605[90810000]40        		mov     byte [Row], 64
  1828 00000C81 C605[91810000]00        		mov     byte [BreakRow], 0
  1829 00000C88 66A1[8E0F0000]          		mov     ax, [MixSpeed]
  1830 00000C8E 31D2                    		xor     edx, edx
  1831 00000C90 66BB3200                		mov     bx, 24*DefBpm/60
  1832 00000C94 66F7F3                  		div     bx
  1833 00000C97 66A3[92810000]          		mov     [BpmSamples], ax
  1834                                  ClearTracks:    
  1835 00000C9D BF[34860000]            		mov     edi, Tracks
  1836                                  		; 06/10/2017
  1837                                  		;mov	ecx, NumTracks*TrackInfo.size
  1838 00000CA2 B826000000              		mov	eax, TrackInfo.size
  1839 00000CA7 0FB70D[890F0000]        		movzx	ecx, word [numtracks]
  1840 00000CAE F7E1                    		mul	ecx
  1841 00000CB0 89C1                    		mov	ecx, eax
  1842 00000CB2 31C0                    		xor     eax, eax
  1843                                  		;cld
  1844 00000CB4 F3AA                    		rep     stosb
  1845                                  
  1846 00000CB6 A3[94810000]            		mov     [BufPtr], eax
  1847 00000CBB 66A3[98810000]          		mov     [BufLen], ax
  1848                                  MakePitch:
  1849 00000CC1 66B80021                		mov     ax, MidCRate
  1850 00000CC5 66BBAC01                		mov     bx, 428
  1851 00000CC9 66F7E3                  		mul     bx
  1852 00000CCC 66F735[8E0F0000]        		div     word [MixSpeed]
  1853 00000CD3 30F6                    		xor     dh, dh
  1854 00000CD5 88E2                    		mov     dl, ah
  1855 00000CD7 88C4                    		mov     ah, al
  1856 00000CD9 30C0                    		xor     al, al
  1857                                  		;mov	cx, 857
  1858 00000CDB 66B9610D                		mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1859 00000CDF 31DB                    		xor     ebx, ebx
  1860 00000CE1 BF[CA150000]            		mov     edi, PitchTable
  1861                                  PitchLoop:      
  1862 00000CE6 50                      		push    eax
  1863 00000CE7 52                      		push    edx
  1864 00000CE8 6639DA                  		cmp     dx, bx
  1865 00000CEB 7303                    		jae     short NoDiv
  1866 00000CED 66F7F3                  		div     bx
  1867                                  NoDiv:          
  1868 00000CF0 66AB                    		stosw
  1869 00000CF2 5A                      		pop     edx
  1870 00000CF3 58                      		pop     eax
  1871                                  		;inc	bx
  1872 00000CF4 43                      		inc	ebx
  1873 00000CF5 E2EF                    		loop    PitchLoop
  1874                                  MakeVolume:     
  1875 00000CF7 66B90041                		mov     cx, 16640
  1876 00000CFB 89CB                    		mov     ebx, ecx
  1877                                  VolLoop:
  1878 00000CFD 664B                    		dec     bx
  1879 00000CFF 88D8                    		mov     al, bl
  1880 00000D01 F6EF                    		imul    bh
  1881                                  		;mov	[VolTable+bx], ah
  1882 00000D03 88A3[8C300000]          		mov     [VolTable+ebx], ah
  1883 00000D09 E2F2                    		loop    VolLoop
  1884                                  
  1885 00000D0B 61                      		popad
  1886                                  		;retn
  1887                                  
  1888                                  ;--------------------------------------------------------------------------
  1889                                  ; StopPlaying: ShutDown the Sound System.
  1890                                  ;--------------------------------------------------------------------------
  1891                                  
  1892                                  StopPlaying:
  1893 00000D0C C3                      		retn
  1894                                  
  1895                                  ;=============================================================================
  1896                                  ;               preinitialized data
  1897                                  ;=============================================================================
  1898                                  
  1899                                  ;=============================================================================
  1900                                  ;               SB.ASM - DATA
  1901                                  ;=============================================================================
  1902                                  
  1903 00000D0D 2002                    SbAddr:		dw      220h
  1904 00000D0F 07                      SbIrq:		db      7
  1905                                  ;Srbs:		db	0 
  1906                                  
  1907                                  ;=============================================================================
  1908                                  ; Protracker effects stuff
  1909                                  ;=============================================================================
  1910                                  
  1911                                  ;-----------------------------------------------------------------------------
  1912                                  ; Effect jump tables
  1913                                  ;-----------------------------------------------------------------------------
  1914                                  
  1915                                  align 4
  1916                                  
  1917                                  efxtable:
  1918 00000D10 [D4090000]              	dd      efxarpeggio	; 0 - arpeggio
  1919 00000D14 [01070000]              	dd      efxnull		; 1 - porta up
  1920 00000D18 [01070000]              	dd      efxnull		; 2 - porta down
  1921 00000D1C [1F090000]              	dd      efxtoneporta	; 3 - tone porta
  1922 00000D20 [2E090000]              	dd      efxvibrato	; 4 - vibrato
  1923 00000D24 [01070000]              	dd      efxnull		; 5 - tone+slide
  1924 00000D28 [01070000]              	dd      efxnull		; 6 - vibrato+slide
  1925 00000D2C [4B0A0000]              	dd      efxtremolo	; 7 - tremolo
  1926 00000D30 [01070000]              	dd      efxnull		; 8 - unused
  1927 00000D34 [56090000]              	dd      efxsampoffset	; 9 - sample offset
  1928 00000D38 [01070000]              	dd      efxnull		; A - volume slide
  1929 00000D3C [62090000]              	dd      efxpattjump	; B - pattern jump
  1930 00000D40 [70090000]              	dd      efxsetvolume	; C - set volume
  1931 00000D44 [7E090000]              	dd      efxbreak	; D - break pattern
  1932 00000D48 [01070000]              	dd      efxnull		; E - extra effects
  1933 00000D4C [9D090000]              	dd      efxsetspeed	; F - set speed
  1934                                  
  1935                                  efxtable2:
  1936 00000D50 [02070000]              	dd      efxarpeggio2	; 0 - arpeggio
  1937 00000D54 [24070000]              	dd      efxportaup	; 1 - porta up
  1938 00000D58 [4A070000]              	dd      efxportadown	; 2 - porta down
  1939 00000D5C [71070000]              	dd      efxtoneporta2	; 3 - tone porta
  1940 00000D60 [AA070000]              	dd      efxvibrato2	; 4 - vibrato
  1941 00000D64 [06080000]              	dd      efxtoneslide	; 5 - tone+slide
  1942 00000D68 [13080000]              	dd      efxvibslide	; 6 - vibrato+slide
  1943 00000D6C [3A080000]              	dd      efxtremolo2	; 7 - tremolo
  1944 00000D70 [01070000]              	dd      efxnull		; 8 - unused
  1945 00000D74 [01070000]              	dd      efxnull		; 9 - sample offset
  1946 00000D78 [1D080000]              	dd      efxvolslide	; A - volume slide
  1947 00000D7C [01070000]              	dd      efxnull		; B - pattern jump
  1948 00000D80 [01070000]              	dd      efxnull		; C - set volume
  1949 00000D84 [01070000]              	dd      efxnull		; D - break pattern
  1950 00000D88 [01070000]              	dd      efxnull		; E - extra effects
  1951 00000D8C [01070000]              	dd      efxnull		; F - set speed
  1952                                  
  1953                                  ;-----------------------------------------------------------------------------
  1954                                  ; Amiga period table
  1955                                  ;-----------------------------------------------------------------------------
  1956                                  
  1957                                  ;PeriodTable0:	
  1958                                  ;	dw	0
  1959                                  PeriodTable:
  1960 00000D90 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1960 00000D99 0A000A7009E8086808-
  1960 00000DA2 F00780071407       
  1961 00000DA8 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1961 00000DB1 050005B80474043404-
  1961 00000DBA F803C0038A03       
  1962 00000DC0 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1962 00000DC9 0280025C023A021A02-
  1962 00000DD2 FC01E001C501       
  1963 00000DD8 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1963 00000DE1 0140012E011D010D01-
  1963 00000DEA FE00F000E200       
  1964 00000DF0 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1964 00000DF9 00A00097008F008700-
  1964 00000E02 7F0078007100       
  1965 00000E08 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1965 00000E11 0050004B0047004300-
  1965 00000E1A 3F003C003800       
  1966 00000E20 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1966 00000E29 002800250023002100-
  1966 00000E32 1F001E001C00       
  1967                                  
  1968                                  ;-----------------------------------------------------------------------------
  1969                                  ; Sinus wave table
  1970                                  ;-----------------------------------------------------------------------------
  1971                                  
  1972                                  SinTable:
  1973 00000E38 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1973 00000E41 C5D4E1             
  1974 00000E44 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1974 00000E4D E1                 
  1975 00000E4E D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1975 00000E57 19                 
  1976                                  
  1977                                  ;=============================================================================
  1978                                  ; Copyright Strings & Messages
  1979                                  ;=============================================================================
  1980 00000E58 0000                    		dw	0
  1981                                  msg_usage:
  1982 00000E5A 54696E79204D4F4420-     		db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1982 00000E63 506C6179657220666F-
  1982 00000E6C 72205452444F532033-
  1982 00000E75 383620627920457264-
  1982 00000E7E 6F67616E2054616E2E-
  1982 00000E87 20                 
  1983 00000E88 4F63746F6265722032-     		db	'October 2017.',10,13
  1983 00000E91 3031372E0A0D       
  1984 00000E97 75736167653A207469-     		db	'usage: tinyplay filename.mod', 10, 13,0
  1984 00000EA0 6E79706C6179206669-
  1984 00000EA9 6C656E616D652E6D6F-
  1984 00000EB2 640A0D00           
  1985 00000EB6 30362F31302F323031-     		db	'06/10/2017',0
  1985 00000EBF 3700               
  1986                                  
  1987                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1988                                  
  1989 00000EC1 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1989 00000ECA 506C61796572207630-
  1989 00000ED3 2E3162206279204361-
  1989 00000EDC 726C6F732048617361-
  1989 00000EE5 6E2E204A756C792031-
  1989 00000EEE 3939332E           
  1990 00000EF2 0A0D00                  		db	10,13,0
  1991 00000EF5 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1991 00000EFE 64696E67204D6F6475-
  1991 00000F07 6C652066696C652E0A-
  1991 00000F10 0D00               
  1992 00000F12 536F756E6420426C61-     MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1992 00000F1B 73746572206E6F7420-
  1992 00000F24 666F756E64206F7220-
  1992 00000F2D 495251206572726F72-
  1992 00000F36 2E0A0D00           
  1993 00000F3A 536F756E6420426C61-     MsgFound:	db	'Sound Blaster found at Address 2'
  1993 00000F43 7374657220666F756E-
  1993 00000F4C 642061742041646472-
  1993 00000F55 6573732032         
  1994 00000F5A 7830682C2049525120      PortText:	db	'x0h, IRQ '
  1995 00000F63 782E0A0D00              IrqText:	db	'x.',10,13,0
  1996                                  
  1997                                  trdos386_err_msg:
  1998 00000F68 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1998 00000F71 2053797374656D2063-
  1998 00000F7A 616C6C206572726F72-
  1998 00000F83 20210A0D00         
  1999                                  
  2000                                  ; 04/10/2017
  2001 00000F88 0A                      pattern_shift:	db 10
  2002 00000F89 0400                    numtracks:	dw 4
  2003                                  
  2004                                  
  2005                                  bss_start:
  2006                                  
  2007                                  ABSOLUTE bss_start
  2008                                  
  2009 00000F8B <res 00000001>          alignb 4
  2010                                  
  2011                                  ;=============================================================================
  2012                                  ;        	uninitialized data
  2013                                  ;=============================================================================
  2014                                  
  2015                                  ; SB.ASM
  2016 00000F8C <res 00000001>          DmaFlag		resb 1		
  2017                                  
  2018                                  ; 11/03/2017
  2019 00000F8D <res 00000001>          iStatus:	resb 1
  2020                                  
  2021                                  ; MODPLAY.ASM
  2022                                  sampling_rate:	; 06/10/2017
  2023 00000F8E <res 00000002>          MixSpeed:	resw 1
  2024                                  
  2025                                  ; MODLOAD.ASM
  2026 00000F90 <res 00000004>          FileHandle:	resd 1
  2027 00000F94 <res 0000043C>          Header:		resb ModHeader.size
  2028                                  
  2029                                  ; MODPLAY.ASM
  2030                                  ;sampling_rate:	; 11/03/2017
  2031                                  ;MixSpeed:	resw 1
  2032                                  
  2033                                  ModInfo:
  2034 000013D0 <res 00000001>          ModInfo.OrderLen:   resb 1
  2035 000013D1 <res 00000001>          ModInfo.ReStart:    resb 1
  2036 000013D2 <res 00000080>          ModInfo.Order:	    resb 128
  2037 00001452 <res 00000004>          ModInfo.Patterns:   resd 1
  2038                                  
  2039 00001456 <res 0000003E>          ModInfo.SampOfs:    resw 31
  2040 00001494 <res 0000003E>          ModInfo.SampSeg:    resw 31
  2041 000014D2 <res 0000003E>          ModInfo.SampLen:    resw 31
  2042 00001510 <res 0000003E>          ModInfo.SampRep:    resw 31
  2043 0000154E <res 0000003E>          ModInfo.SampRepLen: resw 31
  2044 0000158C <res 0000003E>          ModInfo.SampVol:    resw 31
  2045                                  
  2046                                  ; MODPLAY.ASM
  2047                                  PitchTable:	;resw 857
  2048 000015CA <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2049 0000308C <res 00004100>          VolTable:	resb 16640
  2050 0000718C <res 00001000>          MixBuffer       resb MixBufSize
  2051                                  
  2052                                  ; MODPLAY.ASM
  2053 0000818C <res 00000001>          OrderPos:	resb 1
  2054 0000818D <res 00000001>          Tempo:		resb 1
  2055 0000818E <res 00000001>          TempoWait:	resb 1
  2056 0000818F <res 00000001>          Bpm:		resb 1
  2057 00008190 <res 00000001>          Row:		resb 1
  2058 00008191 <res 00000001>          BreakRow:	resb 1
  2059 00008192 <res 00000002>          BpmSamples:	resw 1
  2060 00008194 <res 00000004>          BufPtr:		resd 1
  2061 00008198 <res 00000002>          BufLen:		resw 1
  2062 0000819A <res 00000004>          BufRep:		resd 1
  2063 0000819E <res 00000004>          Note:		resd 1
  2064                                  ;Tracks		resb TrackInfo.size*NumTracks
  2065                                  
  2066 000081A2 <res 0000000E>          alignb 16
  2067                                  
  2068                                  ; PLAY.ASM
  2069 000081B0 <res 00000280>          Scope:		resw	320
  2070 00008430 <res 00000200>          RowOfs:		resw	256
  2071                                  
  2072                                  ;03/03/2017
  2073 00008630 <res 00000004>          DMA_phy_buff:	resd 1
  2074                                  
  2075                                  ; 06/10/2017
  2076 00008634 <res 00000130>          Tracks:		resb TrackInfo.size*8
  2077                                  
  2078                                  mod_file_name:
  2079 00008764 <res 00000010>          		resb 16
  2080                                  
  2081                                  ; 12/03/2017
  2082 00008774 <res 0000788C>          alignb 65536
  2083                                  
  2084                                  DmaBuffer:
  2085 00010000 <res 00010000>          DoubleBuffer:	resb DmaBufSize ; 2048-65536 ; 06/10/2017
  2086                                  
  2087                                  alignb 65536
  2088                                  
  2089                                  file_buffer:
  2090 00020000 <res 00060000>          		resb 65536*6 ; 13/03/2017
  2091                                  EOF:
