     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: 01/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[9C0F0000]            		mov	edi, bss_start
   111 0000000A 29F9                    		sub	ecx, edi
   112 0000000C D1E9                    		shr	ecx, 1
   113 0000000E 31C0                    		xor	eax, eax
   114 00000010 F366AB                  		rep	stosw
   115                                  
   116                                  GetFileName:  
   117 00000013 89E6                    		mov	esi, esp
   118 00000015 AD                      		lodsd
   119 00000016 83F802                  		cmp	eax, 2 ; two arguments 
   120                                  			       ; (program file name & mod file name)
   121 00000019 0F82A3010000            		jb	pmsg_usage ; nothing to do
   122                                  
   123 0000001F AD                      		lodsd ; program file name address 
   124 00000020 AD                      		lodsd ; mod file name address (file to be read)
   125 00000021 89C6                    		mov	esi, eax
   126 00000023 BF[D4860000]            		mov	edi, mod_file_name
   127                                  ScanName:       
   128 00000028 AC                      		lodsb
   129 00000029 84C0                    		test	al, al
   130 0000002B 0F8491010000            		je	pmsg_usage
   131 00000031 3C20                    		cmp	al, 20h
   132 00000033 74F3                    		je	short ScanName		; scan start of name.
   133 00000035 AA                      		stosb
   134 00000036 B4FF                    		mov	ah, 0FFh
   135                                  a_0:	
   136 00000038 FEC4                    		inc	ah
   137                                  a_1:
   138 0000003A AC                      		lodsb
   139 0000003B AA                      		stosb
   140 0000003C 3C2E                    		cmp	al, '.'
   141 0000003E 74F8                    		je	short a_0	
   142 00000040 20C0                    		and	al, al
   143 00000042 75F6                    		jnz	short a_1
   144                                  
   145 00000044 08E4                    		or	ah, ah			; if period NOT found,
   146 00000046 750B                    		jnz	short a_2		; then add a .MOD extension.
   147                                  SetExt:
   148 00000048 4F                      		dec	edi
   149 00000049 C7072E4D4F44            		mov	dword [edi], '.MOD'
   150 0000004F 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 00000053 BB[D50E0000]        <1>  mov ebx, %2
   153                              <1>  %if %0 >= 3
   153 00000058 B9FF000000          <1>  mov ecx, %3
   153                              <1>  %if %0 = 4
   153 0000005D BA0C000000          <1>  mov edx, %4
   153                              <1>  %endif
   153                              <1>  %endif
   153                              <1>  %endif
   153 00000062 B823000000          <1>  mov eax, %1
   153                              <1> 
   153 00000067 CD40                <1>  int 40h
   154                                  
   155 00000069 E86C010000              		call    DetectSb		; Detect the SB Addr, Irq.
   156                                  LoadMod:  
   157 0000006E BF[D4860000]            		mov	edi, mod_file_name
   158 00000073 E8F6040000              		call    LoadModule		; Load the MODule...
   159                                  
   160 00000078 66833D[A20F0000]00      		cmp     word [ErrorInfo], 0	; any error loading?
   161 00000080 741B                    		je      short PlayNow
   162                                  
   163                                  		; yes, print error and Exit.
   164                                  
   165                                  		sys	_msg, ErrorMesg, 255, 0Fh
   165                              <1> 
   165                              <1> 
   165                              <1> 
   165                              <1> 
   165                              <1>  %if %0 >= 2
   165 00000082 BB[090F0000]        <1>  mov ebx, %2
   165                              <1>  %if %0 >= 3
   165 00000087 B9FF000000          <1>  mov ecx, %3
   165                              <1>  %if %0 = 4
   165 0000008C BA0F000000          <1>  mov edx, %4
   165                              <1>  %endif
   165                              <1>  %endif
   165                              <1>  %endif
   165 00000091 B823000000          <1>  mov eax, %1
   165                              <1> 
   165 00000096 CD40                <1>  int 40h
   166                                  
   167 00000098 E919010000              		jmp     Exit
   168                                  
   169                                  PlayNow: 
   170                                  		;; DIRECT MEMORY ACCESS (for Audio DMA)
   171                                  		;; ebx = DMA buffer address (virtual, user)
   172                                  		;; ecx = buffer size (in bytes)
   173                                  		;; edx = upper limit = 16MB
   174                                  
   175                                  		;_16MB	equ 1024*1024*16	
   176                                  
   177                                  		;sys	_alloc, DoubleBuffer, DmaBufSize, _16MB 
   178                                  		;jc	short error_exit
   179                                  
   180                                  		; 12/05/2017
   181                                  		sys	_audio, 0D00h, DmaBufSize, DoubleBuffer
   181                              <1> 
   181                              <1> 
   181                              <1> 
   181                              <1> 
   181                              <1>  %if %0 >= 2
   181 0000009D BB000D0000          <1>  mov ebx, %2
   181                              <1>  %if %0 >= 3
   181 000000A2 B900000100          <1>  mov ecx, %3
   181                              <1>  %if %0 = 4
   181 000000A7 BA[00000100]        <1>  mov edx, %4
   181                              <1>  %endif
   181                              <1>  %endif
   181                              <1>  %endif
   181 000000AC B820000000          <1>  mov eax, %1
   181                              <1> 
   181 000000B1 CD40                <1>  int 40h
   182 000000B3 724A                    		jc	short error_exit
   183                                  
   184 000000B5 A3[D0860000]            		mov	[DMA_phy_buff], eax	; physical address
   185                                  					     	; of the buffer
   186                                  						; (which is needed
   187                                  						; for DMA controller)
   188                                  
   189                                  		; 11/03/2017 (22000 -> 22050)
   190 000000BA 66C705[E0130000]22-     		mov     word [MixSpeed], 22050	; Mixing at 22 kHz
   190 000000C2 56                 
   191                                  
   192                                  ;		call    StartPlaying            ; PLAY!
   193                                  
   194 000000C3 E810030000              		call    SbInit
   195                                  
   196 000000C8 B980000000              		mov     ecx, 128		; Make a lookup table
   197 000000CD 31DB                    		xor     ebx, ebx		; for fastest pixel
   198 000000CF BA002D0000              		mov     edx, 320*(100-64)	; addressing.
   199                                  MakeOfs:        
   200 000000D4 668993[D0840000]        		mov     [RowOfs+ebx], dx
   201 000000DB 668993[D2840000]        		mov     [RowOfs+ebx+2], dx
   202 000000E2 6681C24001              		add     dx, 320
   203 000000E7 83C304                  		add     ebx, 4
   204 000000EA E2E8                    		loop    MakeOfs
   205                                  
   206                                  		;cld
   207                                  
   208                                  		; DIRECT VGA MEMORY ACCESS
   209                                  		; bl = 0, bh = 5
   210                                  		; Direct access/map to VGA memory (0A0000h)
   211                                  
   212                                  		sys	_video, 0500h
   212                              <1> 
   212                              <1> 
   212                              <1> 
   212                              <1> 
   212                              <1>  %if %0 >= 2
   212 000000EC BB00050000          <1>  mov ebx, %2
   212                              <1>  %if %0 >= 3
   212                              <1>  mov ecx, %3
   212                              <1>  %if %0 = 4
   212                              <1>  mov edx, %4
   212                              <1>  %endif
   212                              <1>  %endif
   212                              <1>  %endif
   212 000000F1 B81F000000          <1>  mov eax, %1
   212                              <1> 
   212 000000F6 CD40                <1>  int 40h
   213 000000F8 3D00000A00              		cmp	eax, 0A0000h
   214 000000FD 741B                    		je	short start_scope
   215                                  
   216                                  error_exit:
   217                                  		sys	_msg, trdos386_err_msg, 255, 0Eh
   217                              <1> 
   217                              <1> 
   217                              <1> 
   217                              <1> 
   217                              <1>  %if %0 >= 2
   217 000000FF BB[7C0F0000]        <1>  mov ebx, %2
   217                              <1>  %if %0 >= 3
   217 00000104 B9FF000000          <1>  mov ecx, %3
   217                              <1>  %if %0 = 4
   217 00000109 BA0E000000          <1>  mov edx, %4
   217                              <1>  %endif
   217                              <1>  %endif
   217                              <1>  %endif
   217 0000010E B823000000          <1>  mov eax, %1
   217                              <1> 
   217 00000113 CD40                <1>  int 40h
   218                                  		;jmp	short Exit
   219 00000115 E99C000000              		jmp	Exit
   220                                  		 	
   221                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   222                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   223                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   224                                  ;       second, or the module will sound "looped".
   225                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   226                                  ;       the polling is called from my routine, and then the irq 0 must be
   227                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   228                                  ;       samples played by the Sound Blaster. Note that some samples are
   229                                  ;       discarded in the next code, just for fun!
   230                                  
   231                                  start_scope:
   232                                  		; mov	ax, 0A000h
   233                                  		; mov	es, ax
   234 0000011A 89C7                    		mov	edi, eax  ; 0A0000h
   235                                  
   236                                  		;mov	byte [tLoop], 1
   237                                  	
   238                                  		; 11/03/2017
   239 0000011C 66B81300                		mov     ax, 0013h		; Set Mode 320x200x256
   240 00000120 CD31                    		int     31h
   241                                  ScopeLoop:
   242                                  		; ModPlay Polling!
   243 00000122 E884020000              		call    SbPoll
   244                                  
   245                                  		;cmp	byte [tLoop], 1
   246                                  		;jb	short _StopPlay
   247                                  
   248                                  
   249 00000127 BE[00000100]            		mov     esi, DmaBuffer		; get current samples
   250                                  						; to be drawed ...
   251                                  		; 12/03/2017
   252                                  		; original tinyplay scope drawing code is for 1K buffer
   253                                  		; but now we have 32K buffer, following code is for that...
   254                                  GetDmaCount:
   255                                  		;in	al, 03h
   256 0000012C 66BA0300                		mov	dx, 03h
   257 00000130 B400                    		mov	ah, 0 ; inb
   258 00000132 CD34                    		int	34h	
   259 00000134 88C1                    		mov	cl, al
   260                                  		;in	al, 03h
   261                                  		;mov	ah, 0 ; inb
   262 00000136 CD34                    		int	34h
   263 00000138 88C5                    		mov     ch, al
   264 0000013A 66BAFFFF                		mov	dx, 65535
   265 0000013E 6629CA                  		sub	dx, cx
   266                                  		; 15/03/2017
   267 00000141 6681EAA000              		sub	dx, 160
   268 00000146 6601D6                  		add	si, dx
   269                                  		;
   270 00000149 6631C9                  		xor     cx, cx			
   271 0000014C 6631D2                  		xor     dx, dx
   272                                  DrawLoop:       
   273 0000014F 6689D3                  		mov     bx, dx			; (save Index)
   274 00000152 66678BBF[5082]          		mov     di, [Scope+bx]		; get old SCOPE pixel address
   275                                  		;mov    byte [es:di], 0		; erase it!
   276 00000158 C60700                  		mov	byte [edi], 0
   277                                  		;lodsb				; get a sample (8-bit)
   278                                  		;mov	bl, al
   279                                  		;15/03/2017
   280 0000015B 8A1E                    		mov	bl, [esi]		; calc new pixel address...
   281 0000015D 6646                    		inc	si
   282 0000015F 30FF                    		xor     bh, bh
   283 00000161 66D1E3                  		shl     bx, 1
   284 00000164 66678BBF[D084]          		mov     di, [RowOfs+bx]
   285 0000016A 6601CF                  		add     di, cx
   286 0000016D 6689D3                  		mov     bx, dx			; (restore Index)
   287 00000170 666789BF[5082]          		mov     [Scope+bx], di		; save new address...
   288                                  		;mov	byte [es:di], 10	; and DRAW.
   289 00000176 C6070A                  		mov	byte [edi], 10
   290 00000179 6683C202                		add     dx, 2			; the next pixel...
   291 0000017D 6641                    		inc     cx
   292 0000017F 6681F94001              		cmp     cx, 320			; 320 pixels drawed?
   293 00000184 72C9                    		jb      short DrawLoop
   294                                  CheckAnyKey:
   295 00000186 B401                    		mov     ah, 1			; any key pressed?
   296 00000188 CD32                    		int     32h			; no, Loop.
   297 0000018A 7496                    		jz	short ScopeLoop
   298                                  
   299 0000018C B400                    		mov     ah, 0			; flush key buffer...
   300 0000018E CD32                    		int     32h
   301                                  
   302 00000190 66B80300                		mov     ax, 0003h		; Set Text Mode 80x25x16
   303 00000194 CD31                    		int     31h
   304                                  
   305                                  		;call	StopPlaying		; STOP!
   306                                  
   307                                  		;mov	byte [tLoop], 0
   308                                  _StopPlay:
   309                                  		; 11/03/2017
   310 00000196 30C0                    		xor     al, al
   311                                  		; Stop 8 bit (autoinitialized) DMA process	
   312                                  		;out	0Ch, al
   313                                  		;retn
   314 00000198 66BA0C00                		mov	dx, 0Ch
   315 0000019C B401                    		mov	ah, 1 ;outb
   316 0000019E CD34                    		int	34h
   317                                  
   318 000001A0 E88B030000              		call	SbDone
   319                                  
   320                                  		; Deallocate DMA buffer (not necessary just before exit!)
   321                                  		sys	_dalloc, DoubleBuffer, 2*DmaBufSize
   321                              <1> 
   321                              <1> 
   321                              <1> 
   321                              <1> 
   321                              <1>  %if %0 >= 2
   321 000001A5 BB[00000100]        <1>  mov ebx, %2
   321                              <1>  %if %0 >= 3
   321 000001AA B900000200          <1>  mov ecx, %3
   321                              <1>  %if %0 = 4
   321                              <1>  mov edx, %4
   321                              <1>  %endif
   321                              <1>  %endif
   321                              <1>  %endif
   321 000001AF B82B000000          <1>  mov eax, %1
   321                              <1> 
   321 000001B4 CD40                <1>  int 40h
   322                                  		;jc	error_exit
   323                                  Exit:           
   324 000001B6 E851050000              		call    FreeModule              ; Free MODule core.
   325                                  
   326                                  		sys	_exit			; Bye!
   326                              <1> 
   326                              <1> 
   326                              <1> 
   326                              <1> 
   326                              <1>  %if %0 >= 2
   326                              <1>  mov ebx, %2
   326                              <1>  %if %0 >= 3
   326                              <1>  mov ecx, %3
   326                              <1>  %if %0 = 4
   326                              <1>  mov edx, %4
   326                              <1>  %endif
   326                              <1>  %endif
   326                              <1>  %endif
   326 000001BB B801000000          <1>  mov eax, %1
   326                              <1> 
   326 000001C0 CD40                <1>  int 40h
   327                                  
   328                                  pmsg_usage:
   329                                  		sys	_msg, msg_usage, 255, 0Ah
   329                              <1> 
   329                              <1> 
   329                              <1> 
   329                              <1> 
   329                              <1>  %if %0 >= 2
   329 000001C2 BB[6E0E0000]        <1>  mov ebx, %2
   329                              <1>  %if %0 >= 3
   329 000001C7 B9FF000000          <1>  mov ecx, %3
   329                              <1>  %if %0 = 4
   329 000001CC BA0A000000          <1>  mov edx, %4
   329                              <1>  %endif
   329                              <1>  %endif
   329                              <1>  %endif
   329 000001D1 B823000000          <1>  mov eax, %1
   329                              <1> 
   329 000001D6 CD40                <1>  int 40h
   330 000001D8 EBDC                    		jmp	short Exit
   331                                  
   332                                  DetectSb:
   333 000001DA 60                      		pushad
   334                                  ScanPort:
   335 000001DB 66BB1002                		mov     bx, 210h		; start scanning ports
   336                                  						; 210h, 220h, .. 260h
   337                                  ResetDSP:       
   338 000001DF 6689DA                  		mov     dx, bx			; try to reset the DSP.
   339 000001E2 6683C206                		add     dx, 06h
   340 000001E6 B001                    		mov	al, 1
   341                                  		;out	dx, al
   342 000001E8 B401                    		mov	ah, 1 ; outb
   343 000001EA CD34                    		int	34h
   344                                  
   345                                  		;in	al, dx
   346                                  		;in	al, dx
   347                                  		;in	al, dx
   348                                  		;in	al, dx
   349                                  
   350 000001EC B400                    		mov	ah, 0 ; inb
   351 000001EE CD34                    		int	34h
   352                                  		;mov	ah, 0 ; inb
   353 000001F0 CD34                    		int	34h
   354                                  
   355 000001F2 30C0                    		xor     al, al
   356                                  		;out	dx, al
   357 000001F4 B401                    		mov	ah, 1 ; outb
   358 000001F6 CD34                    		int	34h
   359                                  
   360 000001F8 6683C208                		add     dx, 08h
   361                                  		;mov	cx, 100
   362 000001FC 66B92000                		mov	cx, 32
   363 00000200 28E4                    		sub	ah, ah ; 0
   364                                  WaitID:
   365                                  		;in	al, dx
   366 00000202 CD34                    		int	34h  ;ah = 0 ; inb
   367 00000204 08C0                    		or      al, al
   368 00000206 7804                    		js      short GetID
   369 00000208 E2F8                    		loop    WaitID
   370 0000020A EB10                    		jmp     short NextPort
   371                                  GetID:          
   372 0000020C 6683EA04                		sub     dx, 04h
   373                                  		;in	al, dx
   374 00000210 CD34                    		int	34h  ;ah = 0 ; inb
   375 00000212 3CAA                    		cmp     al, 0AAh
   376 00000214 7416                    		je      short Found
   377 00000216 6683C204                		add     dx, 04h
   378 0000021A E2E6                    		loop    WaitID
   379                                  NextPort:
   380 0000021C 6683C310                		add     bx, 10h			; if not response,
   381 00000220 6681FB6002              		cmp     bx, 260h		; try the next port.
   382 00000225 76B8                    		jbe     short ResetDSP
   383 00000227 E934010000              		jmp     Fail
   384                                  Found:
   385 0000022C 66891D[1F0D0000]        		mov     [SbAddr], bx		; SB Port Address Found!
   386                                  ScanIRQ:
   387                                  SetIrqs:        ; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ
   388                                  		sys	_calbac, 102h, 2, SbIrq ; IRQ 2
   388                              <1> 
   388                              <1> 
   388                              <1> 
   388                              <1> 
   388                              <1>  %if %0 >= 2
   388 00000233 BB02010000          <1>  mov ebx, %2
   388                              <1>  %if %0 >= 3
   388 00000238 B902000000          <1>  mov ecx, %3
   388                              <1>  %if %0 = 4
   388 0000023D BA[210D0000]        <1>  mov edx, %4
   388                              <1>  %endif
   388                              <1>  %endif
   388                              <1>  %endif
   388 00000242 B82C000000          <1>  mov eax, %1
   388                              <1> 
   388 00000247 CD40                <1>  int 40h
   389                                  						; Signal Response Byte
   390                                  		;jc	short error_exit
   391                                  
   392                                  		sys	_calbac, 103h, 3, SbIrq ; IRQ 3
   392                              <1> 
   392                              <1> 
   392                              <1> 
   392                              <1> 
   392                              <1>  %if %0 >= 2
   392 00000249 BB03010000          <1>  mov ebx, %2
   392                              <1>  %if %0 >= 3
   392 0000024E B903000000          <1>  mov ecx, %3
   392                              <1>  %if %0 = 4
   392 00000253 BA[210D0000]        <1>  mov edx, %4
   392                              <1>  %endif
   392                              <1>  %endif
   392                              <1>  %endif
   392 00000258 B82C000000          <1>  mov eax, %1
   392                              <1> 
   392 0000025D CD40                <1>  int 40h
   393                                  						; Signal Response Byte 
   394                                  		;jc	short error_exit
   395                                  
   396                                  		sys	_calbac, 104h, 4, SbIrq ; IRQ 4
   396                              <1> 
   396                              <1> 
   396                              <1> 
   396                              <1> 
   396                              <1>  %if %0 >= 2
   396 0000025F BB04010000          <1>  mov ebx, %2
   396                              <1>  %if %0 >= 3
   396 00000264 B904000000          <1>  mov ecx, %3
   396                              <1>  %if %0 = 4
   396 00000269 BA[210D0000]        <1>  mov edx, %4
   396                              <1>  %endif
   396                              <1>  %endif
   396                              <1>  %endif
   396 0000026E B82C000000          <1>  mov eax, %1
   396                              <1> 
   396 00000273 CD40                <1>  int 40h
   397                                  						; Signal Response Byte 
   398                                  		;jc	short error_exit
   399                                  
   400                                  		sys	_calbac, 105h, 5, SbIrq ; IRQ 5
   400                              <1> 
   400                              <1> 
   400                              <1> 
   400                              <1> 
   400                              <1>  %if %0 >= 2
   400 00000275 BB05010000          <1>  mov ebx, %2
   400                              <1>  %if %0 >= 3
   400 0000027A B905000000          <1>  mov ecx, %3
   400                              <1>  %if %0 = 4
   400 0000027F BA[210D0000]        <1>  mov edx, %4
   400                              <1>  %endif
   400                              <1>  %endif
   400                              <1>  %endif
   400 00000284 B82C000000          <1>  mov eax, %1
   400                              <1> 
   400 00000289 CD40                <1>  int 40h
   401                                  						; Signal Response Byte 
   402                                  		;jc	short error_exit
   403                                  
   404                                  		sys	_calbac, 107h, 7, SbIrq ; IRQ 7
   404                              <1> 
   404                              <1> 
   404                              <1> 
   404                              <1> 
   404                              <1>  %if %0 >= 2
   404 0000028B BB07010000          <1>  mov ebx, %2
   404                              <1>  %if %0 >= 3
   404 00000290 B907000000          <1>  mov ecx, %3
   404                              <1>  %if %0 = 4
   404 00000295 BA[210D0000]        <1>  mov edx, %4
   404                              <1>  %endif
   404                              <1>  %endif
   404                              <1>  %endif
   404 0000029A B82C000000          <1>  mov eax, %1
   404                              <1> 
   404 0000029F CD40                <1>  int 40h
   405                                  						; Signal Response Byte 
   406                                  		;jc	short error_exit
   407                                  
   408 000002A1 C605[210D0000]00        		mov     byte [SbIrq], 0		; clear the IRQ level.
   409                                  
   410 000002A8 668B15[1F0D0000]        		mov     dx, [SbAddr]		; tells to the SB to
   411 000002AF 6683C20C                		add     dx, 0Ch			; generate a IRQ!
   412                                  WaitSb:         ;in	al, dx
   413 000002B3 B400                    		mov	ah, 0 ; inb
   414 000002B5 CD34                    		int	34h
   415 000002B7 08C0                    		or      al, al
   416 000002B9 78F8                    		js      short WaitSb
   417 000002BB B0F2                    		mov     al, 0F2h
   418                                  		;out	dx, al
   419 000002BD B401                    		mov	ah,1  ; outb
   420 000002BF CD34                    		int	34h		
   421                                  
   422 000002C1 31C9                    		xor     ecx, ecx		; wait until IRQ level
   423                                  WaitIRQ:        
   424 000002C3 803D[210D0000]00        		cmp     byte [SbIrq], 0		; is changed or timeout.
   425 000002CA 7506                    		jne     short IrqOk
   426 000002CC 6649                    		dec 	cx
   427 000002CE 75F3                    		jnz	short WaitIRQ
   428 000002D0 EB0F                    		jmp	short RestoreIrqs
   429                                  IrqOk:
   430 000002D2 668B15[1F0D0000]        		mov     dx, [SbAddr]
   431 000002D9 6683C20E                		add     dx, 0Eh
   432                                  		;in	al, dx			; SB acknowledge.
   433 000002DD B400                    		mov	ah, 0 ; inb
   434 000002DF CD34                    		int	34h
   435                                  		;mov	al, 20h
   436                                  		;;out	20h, al			; Hardware acknowledge.
   437                                  		;mov	ah,1  ; outb
   438                                  		;int	34h		
   439                                  
   440                                  RestoreIrqs:    ; UNLINK SIGNAL RESPONSE/RETURN BYTE FROM REQUESTED IRQ
   441                                  		sys	_calbac, 2		; unlink IRQ 2
   441                              <1> 
   441                              <1> 
   441                              <1> 
   441                              <1> 
   441                              <1>  %if %0 >= 2
   441 000002E1 BB02000000          <1>  mov ebx, %2
   441                              <1>  %if %0 >= 3
   441                              <1>  mov ecx, %3
   441                              <1>  %if %0 = 4
   441                              <1>  mov edx, %4
   441                              <1>  %endif
   441                              <1>  %endif
   441                              <1>  %endif
   441 000002E6 B82C000000          <1>  mov eax, %1
   441                              <1> 
   441 000002EB CD40                <1>  int 40h
   442                                  						; Signal Response Byte
   443                                  		sys	_calbac, 3		; unlink IRQ 3
   443                              <1> 
   443                              <1> 
   443                              <1> 
   443                              <1> 
   443                              <1>  %if %0 >= 2
   443 000002ED BB03000000          <1>  mov ebx, %2
   443                              <1>  %if %0 >= 3
   443                              <1>  mov ecx, %3
   443                              <1>  %if %0 = 4
   443                              <1>  mov edx, %4
   443                              <1>  %endif
   443                              <1>  %endif
   443                              <1>  %endif
   443 000002F2 B82C000000          <1>  mov eax, %1
   443                              <1> 
   443 000002F7 CD40                <1>  int 40h
   444                                  						; Signal Response Byte 
   445                                  		sys	_calbac, 4		; unlink IRQ 4
   445                              <1> 
   445                              <1> 
   445                              <1> 
   445                              <1> 
   445                              <1>  %if %0 >= 2
   445 000002F9 BB04000000          <1>  mov ebx, %2
   445                              <1>  %if %0 >= 3
   445                              <1>  mov ecx, %3
   445                              <1>  %if %0 = 4
   445                              <1>  mov edx, %4
   445                              <1>  %endif
   445                              <1>  %endif
   445                              <1>  %endif
   445 000002FE B82C000000          <1>  mov eax, %1
   445                              <1> 
   445 00000303 CD40                <1>  int 40h
   446                                  						; Signal Response Byte 
   447                                  		sys	_calbac, 5		; unlink IRQ 5
   447                              <1> 
   447                              <1> 
   447                              <1> 
   447                              <1> 
   447                              <1>  %if %0 >= 2
   447 00000305 BB05000000          <1>  mov ebx, %2
   447                              <1>  %if %0 >= 3
   447                              <1>  mov ecx, %3
   447                              <1>  %if %0 = 4
   447                              <1>  mov edx, %4
   447                              <1>  %endif
   447                              <1>  %endif
   447                              <1>  %endif
   447 0000030A B82C000000          <1>  mov eax, %1
   447                              <1> 
   447 0000030F CD40                <1>  int 40h
   448                                  						; Signal Response Byte
   449                                  		sys	_calbac, 7		; unlink IRQ 7
   449                              <1> 
   449                              <1> 
   449                              <1> 
   449                              <1> 
   449                              <1>  %if %0 >= 2
   449 00000311 BB07000000          <1>  mov ebx, %2
   449                              <1>  %if %0 >= 3
   449                              <1>  mov ecx, %3
   449                              <1>  %if %0 = 4
   449                              <1>  mov edx, %4
   449                              <1>  %endif
   449                              <1>  %endif
   449                              <1>  %endif
   449 00000316 B82C000000          <1>  mov eax, %1
   449                              <1> 
   449 0000031B CD40                <1>  int 40h
   450                                  						; Signal Response Byte 
   451                                  
   452 0000031D 803D[210D0000]00        		cmp     byte [SbIrq], 0		; IRQ level was changed?
   453 00000324 743A                    		je      short Fail		; no, fail.
   454                                  Success:        
   455 00000326 668B15[1F0D0000]        		mov     dx, [SbAddr]		; Print Sucessful message.
   456 0000032D 8A0D[210D0000]          		mov     cl, [SbIrq]
   457 00000333 C0EA04                  		shr     dl, 4
   458 00000336 80C230                  		add     dl, '0'
   459 00000339 8815[6E0F0000]          		mov     [PortText], dl
   460 0000033F 80C130                  		add     cl, '0'
   461 00000342 880D[770F0000]          		mov     [IrqText], cl
   462                                  
   463                                  		sys	_msg, MsgFound, 255, 0Fh
   463                              <1> 
   463                              <1> 
   463                              <1> 
   463                              <1> 
   463                              <1>  %if %0 >= 2
   463 00000348 BB[4E0F0000]        <1>  mov ebx, %2
   463                              <1>  %if %0 >= 3
   463 0000034D B9FF000000          <1>  mov ecx, %3
   463                              <1>  %if %0 = 4
   463 00000352 BA0F000000          <1>  mov edx, %4
   463                              <1>  %endif
   463                              <1>  %endif
   463                              <1>  %endif
   463 00000357 B823000000          <1>  mov eax, %1
   463                              <1> 
   463 0000035C CD40                <1>  int 40h
   464                                  
   465 0000035E 61                      		popad				; Return to caller.
   466 0000035F C3                      		retn
   467                                  
   468                                  Fail:  
   469                                  		; Print Failed Message,
   470                                  		; and exit to MainProg.
   471                                  
   472                                  		sys	_msg, MsgNotFound, 255, 0Fh
   472                              <1> 
   472                              <1> 
   472                              <1> 
   472                              <1> 
   472                              <1>  %if %0 >= 2
   472 00000360 BB[260F0000]        <1>  mov ebx, %2
   472                              <1>  %if %0 >= 3
   472 00000365 B9FF000000          <1>  mov ecx, %3
   472                              <1>  %if %0 = 4
   472 0000036A BA0F000000          <1>  mov edx, %4
   472                              <1>  %endif
   472                              <1>  %endif
   472                              <1>  %endif
   472 0000036F B823000000          <1>  mov eax, %1
   472                              <1> 
   472 00000374 CD40                <1>  int 40h
   473                                  
   474                                  		sys 	_exit
   474                              <1> 
   474                              <1> 
   474                              <1> 
   474                              <1> 
   474                              <1>  %if %0 >= 2
   474                              <1>  mov ebx, %2
   474                              <1>  %if %0 >= 3
   474                              <1>  mov ecx, %3
   474                              <1>  %if %0 = 4
   474                              <1>  mov edx, %4
   474                              <1>  %endif
   474                              <1>  %endif
   474                              <1>  %endif
   474 00000376 B801000000          <1>  mov eax, %1
   474                              <1> 
   474 0000037B CD40                <1>  int 40h
   475                                  here:
   476 0000037D EBFE                    		jmp	short here
   477                                  
   478                                  ;=============================================================================
   479                                  ;               SB.ASM
   480                                  ;=============================================================================
   481                                  
   482                                  ;  Sound Blaster DMA Driver v0.1b by Carlos Hasan.
   483                                  ;		July 24th, 1993.
   484                                  
   485                                  ; EQUATES
   486                                  
   487                                  DmaBufSize 	equ	65536 ; 12/03/2017
   488                                  
   489                                  ; MACROS
   490                                  
   491                                  %macro	SbOut	1
   492                                  %%Wait:
   493                                  	;in	al, dx
   494                                  	mov	ah, 0
   495                                  	int	34h
   496                                  	or	al, al
   497                                  	js	short %%Wait
   498                                  	mov	al, %1
   499                                  	;out	dx, al
   500                                  	mov	ah, 1
   501                                  	int	34h
   502                                  %endmacro
   503                                  
   504                                  ; CODE
   505                                  
   506                                  ;--------------------------------------------------------------------------
   507                                  ; SbIrqHandler:  Sound Blaster IRQ handler.
   508                                  ;--------------------------------------------------------------------------
   509                                  
   510                                  SbIrqHandler:	; SoundBlaster IRQ Callback service for TRDOS 386
   511                                  		; 03/03/2017
   512                                  
   513                                  		; 12/03/2017
   514                                  		; 11/03/2017
   515                                  
   516 0000037F 668B15[1F0D0000]        		mov     dx, [SbAddr]
   517 00000386 6683C20E                		add     dx, 0Eh
   518                                  		;in	al, dx
   519                                  		;mov	ah, 0
   520 0000038A 28E4                    		sub	ah, ah
   521 0000038C CD34                    		int	34h
   522                                  
   523                                  		;test	byte [flags], ENDOFFILE	; end of file flag
   524                                  		;jz	short a_3
   525                                  
   526                                  		;sub     dx, 02h ; 0Ch
   527                                  
   528                                  		; exit auto-initialize 8 bit transfer
   529                                  		;SbOut	0DAh ; exit auto-initialize transfer command
   530                                  		;jmp	short a_5
   531                                  
   532                                  a_3:
   533 0000038E 30C0                    		xor	al, al ; 0
   534 00000390 A2[9D0F0000]            		mov	[iStatus], al
   535 00000395 3805[9C0F0000]          		cmp 	[DmaFlag], al
   536 0000039B 7702                    		ja	short a_4
   537 0000039D FEC0                    		inc	al
   538                                  a_4:
   539 0000039F A2[9C0F0000]            		mov 	[DmaFlag], al ; 
   540                                  a_5:
   541                                  		sys	_rele ; return from callback service
   541                              <1> 
   541                              <1> 
   541                              <1> 
   541                              <1> 
   541                              <1>  %if %0 >= 2
   541                              <1>  mov ebx, %2
   541                              <1>  %if %0 >= 3
   541                              <1>  mov ecx, %3
   541                              <1>  %if %0 = 4
   541                              <1>  mov edx, %4
   541                              <1>  %endif
   541                              <1>  %endif
   541                              <1>  %endif
   541 000003A4 B827000000          <1>  mov eax, %1
   541                              <1> 
   541 000003A9 CD40                <1>  int 40h
   542                                  
   543                                  ;--------------------------------------------------------------------------
   544                                  ; SbPoll:  Sound Blaster Polling.
   545                                  ;--------------------------------------------------------------------------
   546                                  
   547                                  SbPoll:
   548 000003AB 60                      		pushad
   549                                  		
   550                                  		; 11/03/2017
   551 000003AC 803D[9D0F0000]00        		cmp	byte [iStatus], 0
   552 000003B3 7721                    		ja	short Bye
   553                                  	
   554 000003B5 C605[9D0F0000]01        		mov	byte [iStatus], 1 ; 1 = set before interrupt
   555                                  			     ; (for preventing data load
   556                                  			     ; without an interrupt)	
   557                                  
   558                                  		;test	byte [flags], ENDOFFILE
   559                                  		;jnz	short sbPoll_stop
   560                                  
   561 000003BC BF[00000100]            		mov     edi, DmaBuffer
   562 000003C1 BB00800000              		mov     ebx, DmaBufSize/2
   563                                  
   564 000003C6 F605[9C0F0000]01        		test	byte [DmaFlag], 1
   565 000003CD 7402                    		jz	short FirstHalf
   566                                  SecondHalf:
   567 000003CF 01DF                    		add     edi, ebx
   568                                  FirstHalf:
   569 000003D1 E828080000              		call    GetSamples
   570                                  Bye:
   571 000003D6 61                      		popad
   572 000003D7 C3                      		retn
   573                                  
   574                                  ;sbPoll_stop:	; 11/03/2017
   575                                  ;		; exit auto-initialize 8 bit transfer
   576                                  ;		SbOut	0DAh ; exit auto-initialize transfer command
   577                                  ;		;mov	byte [tLoop}, 0
   578                                  ;		jmp	short Bye
   579                                  
   580                                  ;--------------------------------------------------------------------------
   581                                  ; SbInit: Initializes the Sound Blaster Driver.
   582                                  ;--------------------------------------------------------------------------
   583                                  
   584                                  SbInit:
   585 000003D8 60                      		pushad
   586                                  
   587 000003D9 E89B080000              		call    StartPlaying
   588                                  SetBuffer:
   589                                  		;mov	byte [DmaFlag], 0
   590 000003DE 8B1D[D0860000]          		mov	ebx, [DMA_phy_buff] ; physical addr of DMA buff
   591 000003E4 B900000100              		mov     ecx, DmaBufSize
   592 000003E9 49                      		dec     ecx
   593                                  
   594                                  		; 8 bit DMA buffer setting (DMA channel 1)
   595 000003EA B005                    		mov     al, 05h ; set mask bit for channel 1  (4+1)
   596                                  		;out	0Ah, al
   597 000003EC 66BA0A00                		mov	dx, 0Ah ; DMA mask register
   598 000003F0 B401                    		mov	ah, 1  ;outb
   599 000003F2 CD34                    		int	34h
   600                                  
   601 000003F4 30C0                    		xor     al, al ; stops all DMA processes on selected channel
   602                                  		;out	0Ch, al
   603 000003F6 B20C                    		mov	dl, 0Ch  ; clear selected channel register
   604                                  		;mov	ah, 1  ;outb
   605 000003F8 CD34                    		int	34h
   606                                  
   607 000003FA 88D8                    		mov     al, bl	; byte 0 of DMA buffer address (physical)   
   608                                  		;out	02h, al
   609 000003FC B202                    		mov	dl, 02h	; DMA channel 1 port number
   610                                  		;mov	ah, 1  ;outb
   611 000003FE CD34                    		int	34h
   612                                  
   613 00000400 88F8                    		mov     al, bh  ; byte 1 of DMA buffer address (physical)   
   614                                  		;out	02h, al
   615                                  		;mov	dl, 02h ; DMA channel 1 port number
   616                                  		;mov	ah, 1  ;outb
   617 00000402 CD34                    		int	34h
   618                                  
   619 00000404 C1EB10                  		shr	ebx, 16
   620                                  
   621 00000407 88D8                    		mov     al, bl ; byte 2 of DMA buffer address (physical)   
   622                                  		;out	83h, al
   623 00000409 B283                    		mov	dl, 83h ; page register port addr for channel 1
   624                                  		;mov	ah, 1  ;outb
   625 0000040B CD34                    		int	34h
   626                                  
   627 0000040D 88C8                    		mov     al, cl ; low byte of DMA count - 1
   628                                  		;out	03h, al
   629 0000040F B203                    		mov	dl, 03h ; count register port addr for channel 1
   630                                  		;mov	ah, 1  ;outb
   631 00000411 CD34                    		int	34h
   632                                  
   633 00000413 88E8                    		mov     al, ch ; high byte of DMA count - 1
   634                                  		;out	03h, al
   635                                  		;mov	dl, 03h ; count register port addr for channel 1
   636                                  		;mov	ah, 1  ;outb
   637 00000415 CD34                    		int	34h
   638                                  
   639                                  		; channel 1, read, autoinitialized, single mode
   640 00000417 B059                    		mov     al, 59h ; 07/09/2017
   641                                  		;out	0Bh, al
   642 00000419 B20B                    		mov	dl, 0Bh ; DMA mode register port address
   643                                  		;mov	ah, 1  ;outb
   644 0000041B CD34                    		int	34h
   645                                  
   646 0000041D B001                    		mov     al, 01h ; clear mask bit for channel 1
   647                                  		;out	0Ah, al
   648 0000041F B20A                    		mov	dl, 0Ah ; DMA mask register port address
   649                                  		;mov	ah, 1  ;outb
   650 00000421 CD34                    		int	34h
   651                                  ClearBuffer:
   652 00000423 BF[00000100]            		mov     edi, DmaBuffer	; virtual addr of DMA buff
   653                                  		;mov	ecx, DmaBufSize
   654 00000428 41                      		inc	ecx
   655 00000429 B080                    		mov     al, 80h
   656                                  		;cld
   657 0000042B F3AA                    		rep     stosb
   658                                  SetIrq:
   659                                  		; CALLBACK method
   660 0000042D 8A1D[210D0000]          		mov	bl, [SbIrq] ; IRQ number
   661 00000433 B702                    		mov	bh, 2 ; Link IRQ to user for callback service
   662 00000435 BA[7F030000]            		mov	edx, SbIrqHandler
   663                                  		sys	_calbac 
   663                              <1> 
   663                              <1> 
   663                              <1> 
   663                              <1> 
   663                              <1>  %if %0 >= 2
   663                              <1>  mov ebx, %2
   663                              <1>  %if %0 >= 3
   663                              <1>  mov ecx, %3
   663                              <1>  %if %0 = 4
   663                              <1>  mov edx, %4
   663                              <1>  %endif
   663                              <1>  %endif
   663                              <1>  %endif
   663 0000043A B82C000000          <1>  mov eax, %1
   663                              <1> 
   663 0000043F CD40                <1>  int 40h
   664                                  		; SIGNAL RESPONSE BYTE method ; 04/03/2017
   665                                  		;mov	bl, [SbIrq]
   666                                  		;mov	bh, 1 ; Signal Response Byte method
   667                                  		;movzx	ecx, bl ; S.R.B. value = IRQ Number 
   668                                  		;mov	edx, SbSrb ; S.R.B. address
   669                                  		;sys	_calbac
   670                                  ResetDsp:
   671 00000441 668B15[1F0D0000]        		mov     dx, [SbAddr]
   672 00000448 6683C206                		add     dx, 06h
   673 0000044C B001                    		mov     al, 1
   674                                  		;out	dx, al
   675 0000044E B401                    		mov	ah, 1  ;outb
   676 00000450 CD34                    		int	34h
   677                                  
   678                                  		;in	al, dx
   679                                  		;in	al, dx
   680                                  		;in	al, dx
   681                                  		;in	al, dx
   682                                  
   683 00000452 FECC                    		dec	ah ; ah = 0 ; inb
   684 00000454 CD34                    		int	34h		
   685                                  		;mov	ah, 0
   686 00000456 CD34                    		int	34h
   687                                  
   688 00000458 30C0                    		xor     al, al
   689                                  		;out	dx, al
   690 0000045A FEC4                    		inc	ah ; ah = 1 ;outb
   691 0000045C CD34                    		int	34h
   692                                  
   693 0000045E 66B96400                		mov     cx, 100
   694 00000462 28E4                    		sub	ah, ah ; 0
   695                                  WaitId:         
   696 00000464 668B15[1F0D0000]        		mov     dx, [SbAddr]
   697 0000046B 6683C20E                		add     dx, 0Eh
   698                                  		;in	al, dx
   699                                  		;mov	ah, 0  ;inb
   700 0000046F CD34                    		int	34h
   701 00000471 08C0                    		or      al, al
   702 00000473 7807                    		js      short sb_GetId
   703 00000475 E2ED                    		loop    WaitId
   704 00000477 E9B2000000              		jmp     sb_Exit
   705                                  sb_GetId:          
   706 0000047C 668B15[1F0D0000]        		mov     dx, [SbAddr]
   707 00000483 6683C20A                		add     dx, 0Ah
   708                                  		;in	al, dx
   709                                  		;mov	ah, 0  ;inb
   710 00000487 CD34                    		int	34h
   711 00000489 3CAA                    		cmp     al, 0AAh
   712 0000048B 7407                    		je      short SbOk
   713 0000048D E2D5                    		loop    WaitId
   714 0000048F E99A000000              		jmp	sb_Exit
   715                                  SbOk:
   716 00000494 668B15[1F0D0000]        		mov     dx, [SbAddr]
   717 0000049B 6683C20C                		add     dx, 0Ch
   718                                  		SbOut   0D1h
   718                              <1> %%Wait:
   718                              <1> 
   718 0000049F B400                <1>  mov ah, 0
   718 000004A1 CD34                <1>  int 34h
   718 000004A3 08C0                <1>  or al, al
   718 000004A5 78F8                <1>  js short %%Wait
   718 000004A7 B0D1                <1>  mov al, %1
   718                              <1> 
   718 000004A9 B401                <1>  mov ah, 1
   718 000004AB CD34                <1>  int 34h
   719                                  		
   720                                  		; 11/03/2017
   721                                  		SbOut   41h ; 8 bit or 16 bit transfer
   721                              <1> %%Wait:
   721                              <1> 
   721 000004AD B400                <1>  mov ah, 0
   721 000004AF CD34                <1>  int 34h
   721 000004B1 08C0                <1>  or al, al
   721 000004B3 78F8                <1>  js short %%Wait
   721 000004B5 B041                <1>  mov al, %1
   721                              <1> 
   721 000004B7 B401                <1>  mov ah, 1
   721 000004B9 CD34                <1>  int 34h
   722 000004BB 668B1D[E0130000]        		mov	bx, [sampling_rate]
   723                                  		SbOut	bh ; sampling rate high byte
   723                              <1> %%Wait:
   723                              <1> 
   723 000004C2 B400                <1>  mov ah, 0
   723 000004C4 CD34                <1>  int 34h
   723 000004C6 08C0                <1>  or al, al
   723 000004C8 78F8                <1>  js short %%Wait
   723 000004CA 88F8                <1>  mov al, %1
   723                              <1> 
   723 000004CC B401                <1>  mov ah, 1
   723 000004CE CD34                <1>  int 34h
   724                                  		SbOut	bl ; sampling rate low byte
   724                              <1> %%Wait:
   724                              <1> 
   724 000004D0 B400                <1>  mov ah, 0
   724 000004D2 CD34                <1>  int 34h
   724 000004D4 08C0                <1>  or al, al
   724 000004D6 78F8                <1>  js short %%Wait
   724 000004D8 88D8                <1>  mov al, %1
   724                              <1> 
   724 000004DA B401                <1>  mov ah, 1
   724 000004DC CD34                <1>  int 34h
   725                                  		
   726                                  		; 22/04/2017
   727                                  		;mov	ah, 1
   728                                  		;mov	dx, [SbAddr]
   729                                  		;add	dx, 4 ; Mixer chip address port
   730 000004DE 6683EA08                		sub	dx, 0Ch-04h
   731 000004E2 B022                    		mov	al, 22h ; master volume
   732 000004E4 CD34                    		int	34h
   733 000004E6 6642                    		inc	dx
   734 000004E8 B0FF                    		mov	al, 0FFh ; maximum volume level
   735 000004EA CD34                    		int	34h
   736 000004EC 6683C207                		add	dx, 0Ch-05h
   737                                  StartDma:  
   738                                  		; autoinitialized 8 bit DMA transfer mode
   739                                  		;mov	bx, 0C6h ; 8 bit output (0C6h)
   740                                  		; PCM output (8 bit mono autoinitialized transfer)
   741                                  		;SbOut  bl ; bCommand
   742                                  		;SbOut	bh ; bMode
   743                                  		SbOut	0C6h ; bCommand (C6h = 8 bit autoinitialzed)
   743                              <1> %%Wait:
   743                              <1> 
   743 000004F0 B400                <1>  mov ah, 0
   743 000004F2 CD34                <1>  int 34h
   743 000004F4 08C0                <1>  or al, al
   743 000004F6 78F8                <1>  js short %%Wait
   743 000004F8 B0C6                <1>  mov al, %1
   743                              <1> 
   743 000004FA B401                <1>  mov ah, 1
   743 000004FC CD34                <1>  int 34h
   744                                  		SbOut	0    ; bMode (0 = 8 bit mono)	
   744                              <1> %%Wait:
   744                              <1> 
   744 000004FE B400                <1>  mov ah, 0
   744 00000500 CD34                <1>  int 34h
   744 00000502 08C0                <1>  or al, al
   744 00000504 78F8                <1>  js short %%Wait
   744 00000506 B000                <1>  mov al, %1
   744                              <1> 
   744 00000508 B401                <1>  mov ah, 1
   744 0000050A CD34                <1>  int 34h
   745 0000050C 66BB0080                		mov	bx, DmaBufSize / 2
   746 00000510 664B                    		dec	bx  ; wBlkSize is one less than the actual size 
   747                                  		SbOut   bl
   747                              <1> %%Wait:
   747                              <1> 
   747 00000512 B400                <1>  mov ah, 0
   747 00000514 CD34                <1>  int 34h
   747 00000516 08C0                <1>  or al, al
   747 00000518 78F8                <1>  js short %%Wait
   747 0000051A 88D8                <1>  mov al, %1
   747                              <1> 
   747 0000051C B401                <1>  mov ah, 1
   747 0000051E CD34                <1>  int 34h
   748                                  		SbOut   bh
   748                              <1> %%Wait:
   748                              <1> 
   748 00000520 B400                <1>  mov ah, 0
   748 00000522 CD34                <1>  int 34h
   748 00000524 08C0                <1>  or al, al
   748 00000526 78F8                <1>  js short %%Wait
   748 00000528 88F8                <1>  mov al, %1
   748                              <1> 
   748 0000052A B401                <1>  mov ah, 1
   748 0000052C CD34                <1>  int 34h
   749                                  sb_Exit:           
   750 0000052E 61                      		popad
   751 0000052F C3                      		retn
   752                                  
   753                                  ;--------------------------------------------------------------------------
   754                                  ; SbDone:  Shut Down the Sound Blaster Driver.
   755                                  ;--------------------------------------------------------------------------
   756                                  
   757                                  SbDone:
   758 00000530 60                      		pushad
   759                                  
   760 00000531 8A1D[210D0000]          		mov     bl, [SbIrq] ; IRQ number
   761 00000537 28FF                    		sub	bh, bh ; 0 = Unlink IRQ from user
   762                                  		sys	_calbac 
   762                              <1> 
   762                              <1> 
   762                              <1> 
   762                              <1> 
   762                              <1>  %if %0 >= 2
   762                              <1>  mov ebx, %2
   762                              <1>  %if %0 >= 3
   762                              <1>  mov ecx, %3
   762                              <1>  %if %0 = 4
   762                              <1>  mov edx, %4
   762                              <1>  %endif
   762                              <1>  %endif
   762                              <1>  %endif
   762 00000539 B82C000000          <1>  mov eax, %1
   762                              <1> 
   762 0000053E CD40                <1>  int 40h
   763                                  
   764 00000540 668B15[1F0D0000]        		mov     dx, [SbAddr]
   765 00000547 6683C20C                		add     dx, 0Ch
   766                                  		SbOut   0D0h
   766                              <1> %%Wait:
   766                              <1> 
   766 0000054B B400                <1>  mov ah, 0
   766 0000054D CD34                <1>  int 34h
   766 0000054F 08C0                <1>  or al, al
   766 00000551 78F8                <1>  js short %%Wait
   766 00000553 B0D0                <1>  mov al, %1
   766                              <1> 
   766 00000555 B401                <1>  mov ah, 1
   766 00000557 CD34                <1>  int 34h
   767                                  		SbOut   0D3h
   767                              <1> %%Wait:
   767                              <1> 
   767 00000559 B400                <1>  mov ah, 0
   767 0000055B CD34                <1>  int 34h
   767 0000055D 08C0                <1>  or al, al
   767 0000055F 78F8                <1>  js short %%Wait
   767 00000561 B0D3                <1>  mov al, %1
   767                              <1> 
   767 00000563 B401                <1>  mov ah, 1
   767 00000565 CD34                <1>  int 34h
   768                                  
   769 00000567 E8B2070000              		call    StopPlaying
   770                                  
   771 0000056C 61                      		popad
   772 0000056D C3                      		retn
   773                                  
   774                                  ;=============================================================================
   775                                  ;               MODLOAD.ASM
   776                                  ;=============================================================================
   777                                  
   778                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   779                                  ;		July 10th, 1993.
   780                                  
   781                                  ; STRUCTURES
   782                                  
   783                                  struc ModSample
   784 00000000 <res 00000016>          .msName:	resb 22
   785 00000016 <res 00000002>          .msLength:	resw 1
   786 00000018 <res 00000001>          .msFinetune:	resb 1
   787 00000019 <res 00000001>          .msVolume:	resb 1
   788 0000001A <res 00000002>          .msRepeat:	resw 1
   789 0000001C <res 00000002>          .msRepLen:	resw 1
   790                                  .size:		; 30 bytes
   791                                  endstruc
   792                                  
   793                                  struc ModHeader
   794 00000000 <res 00000014>          .mhName:	resb 20
   795 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   796 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   797 000003B7 <res 00000001>          .mhReStart:	resb 1
   798 000003B8 <res 00000080>          .mhOrder:	resb 128
   799 00000438 <res 00000004>          .mhSign:	resw 2
   800                                  .size:		; 1082 bytes
   801                                  endstruc
   802                                  
   803                                  struc ModInfoRec
   804 00000000 <res 00000001>          .OrderLen:	resb 1
   805 00000001 <res 00000001>          .ReStart:	resb 1
   806 00000002 <res 00000080>          .Order:		resb 128
   807 00000082 <res 00000004>          .Patterns:	resd 1
   808 00000086 <res 0000003E>          .SampOfs:	resw 31
   809 000000C4 <res 0000003E>          .SampSeg:	resw 31
   810 00000102 <res 0000003E>          .SampLen:	resw 31
   811 00000140 <res 0000003E>          .SampRep:	resw 31
   812 0000017E <res 0000003E>          .SampRepLen:	resw 31
   813 000001BC <res 0000003E>          .SampVol:	resw 31
   814                                  .size:		; 506 bytes	
   815                                  endstruc
   816                                  
   817                                  ; CODE
   818                                  
   819                                  LoadModule:
   820                                  		; edi = file name address
   821                                  
   822 0000056E 60                      		pushad
   823                                  
   824 0000056F 66C705[A20F0000]01-     		mov	word [ErrorInfo], 1
   824 00000577 00                 
   825                                  
   826 00000578 E88F010000              		call    ClearModInfo
   827                                  OpenFile:       
   828                                  		; ebx = ASCIIZ file name address
   829                                  		; ecx = open mode (0 = open for read)		
   830                                  		sys	_open, edi, 0 ; open for reading
   830                              <1> 
   830                              <1> 
   830                              <1> 
   830                              <1> 
   830                              <1>  %if %0 >= 2
   830 0000057D 89FB                <1>  mov ebx, %2
   830                              <1>  %if %0 >= 3
   830 0000057F B900000000          <1>  mov ecx, %3
   830                              <1>  %if %0 = 4
   830                              <1>  mov edx, %4
   830                              <1>  %endif
   830                              <1>  %endif
   830                              <1>  %endif
   830 00000584 B805000000          <1>  mov eax, %1
   830                              <1> 
   830 00000589 CD40                <1>  int 40h
   831 0000058B 0F8279010000            		jc	Failed
   832 00000591 A3[9E0F0000]            		mov     [FileHandle], eax
   833                                  ReadHeader:
   834                                  		; ebx = File handle
   835                                  		; ecx = Buffer address
   836                                  		; edx = Byte count
   837                                  		sys	_read, [FileHandle], Header, ModHeader.size
   837                              <1> 
   837                              <1> 
   837                              <1> 
   837                              <1> 
   837                              <1>  %if %0 >= 2
   837 00000596 8B1D[9E0F0000]      <1>  mov ebx, %2
   837                              <1>  %if %0 >= 3
   837 0000059C B9[A40F0000]        <1>  mov ecx, %3
   837                              <1>  %if %0 = 4
   837 000005A1 BA3C040000          <1>  mov edx, %4
   837                              <1>  %endif
   837                              <1>  %endif
   837                              <1>  %endif
   837 000005A6 B803000000          <1>  mov eax, %1
   837                              <1> 
   837 000005AB CD40                <1>  int 40h
   838 000005AD 0F824A010000            		jc      CloseFile
   839                                  CheckMK:        
   840 000005B3 813D[DC130000]4D2E-     		cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   840 000005BB 4B2E               
   841 000005BD 7440                    		je      short IsModFile
   842                                  CheckFLT4:
   843 000005BF 813D[DC130000]464C-     		cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   843 000005C7 5434               
   844 000005C9 7434                    		je      short IsModFile
   845                                  Is15Inst:
   846 000005CB BE[7A110000]            		mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   847 000005D0 BF[5A130000]            		mov     edi, Header+ModHeader.mhOrderLen
   848                                  		;cld
   849                                  		;mov	ecx, 130
   850 000005D5 66B98200                		mov	cx, 130
   851 000005D9 F3A4                    		rep     movsb
   852 000005DB BF[7A110000]            		mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   853 000005E0 30C0                    		xor     al, al
   854 000005E2 66B9E001                		mov     cx, 16*ModSample.size
   855 000005E6 F3AA                    		rep     stosb
   856                                  SeekPatterns:   
   857                                  		; ebx = [FileHandle]
   858                                  		; ecx = offset
   859                                  		; edx = switch (0 = from beginning)
   860                                  		sys	_seek, [FileHandle], 600, 0
   860                              <1> 
   860                              <1> 
   860                              <1> 
   860                              <1> 
   860                              <1>  %if %0 >= 2
   860 000005E8 8B1D[9E0F0000]      <1>  mov ebx, %2
   860                              <1>  %if %0 >= 3
   860 000005EE B958020000          <1>  mov ecx, %3
   860                              <1>  %if %0 = 4
   860 000005F3 BA00000000          <1>  mov edx, %4
   860                              <1>  %endif
   860                              <1>  %endif
   860                              <1>  %endif
   860 000005F8 B813000000          <1>  mov eax, %1
   860                              <1> 
   860 000005FD CD40                <1>  int 40h
   861                                  IsModFile:
   862 000005FF A0[5A130000]            		mov     al, [Header+ModHeader.mhOrderLen]
   863 00000604 A2[E2130000]            		mov     [ModInfo.OrderLen], al
   864                                  
   865 00000609 A0[5B130000]            		mov     al, [Header+ModHeader.mhReStart]
   866 0000060E 3A05[5A130000]          		cmp     al, [Header+ModHeader.mhOrderLen]
   867 00000614 7202                    		jb      short SetReStart
   868 00000616 B07F                    		mov     al, 7Fh
   869                                  SetReStart:
   870 00000618 A2[E3130000]            		mov     [ModInfo.ReStart], al
   871                                  
   872                                  		;mov	ecx, 128
   873 0000061D 66B98000                		mov	cx, 128
   874 00000621 31D2                    		xor     edx, edx
   875 00000623 31DB                    		xor     ebx, ebx
   876                                  CopyOrder:
   877 00000625 8AB3[5C130000]          		mov     dh, [Header+ModHeader.mhOrder+ebx]
   878 0000062B 88B3[E4130000]          		mov     [ModInfo.Order+ebx], dh
   879 00000631 38D6                    		cmp     dh, dl
   880 00000633 7202                    		jb      short NextOrder
   881 00000635 88F2                    		mov     dl, dh
   882                                  NextOrder:
   883 00000637 43                      		inc     ebx
   884 00000638 E2EB                    		loop    CopyOrder
   885                                  AllocPatterns:  
   886 0000063A 81E2FF000000            		and	edx, 0FFh
   887 00000640 6642                    		inc	dx  ; 12/03/2017
   888                                  		; dl = count of 1024 bytes ; count of patterns (04/07/2017)
   889 00000642 C1E20A                  		shl	edx, 10 ; *1024 ; (count of patterns *64*16)
   890                                  
   891 00000645 89D5                    		mov	ebp, edx ; offset of samples (04/07/2017)
   892                                  		;mov	ecx, 10000h ; next 64K (4096*16)
   893 00000647 B9[00000200]            		mov	ecx, file_buffer ; 12/03/2017
   894                                  		;
   895 0000064C 890D[64140000]          		mov	[ModInfo.Patterns], ecx
   896                                  		;
   897 00000652 01CD                    		add	ebp, ecx ; next offset for samples
   898                                  ReadPatterns:  
   899                                  		;mov	ebx, [FileHandle] 
   900                                  		; ebx = File handle
   901                                  		; ecx = Buffer address
   902                                  		; edx = Byte count
   903                                  		sys	_read, [FileHandle]
   903                              <1> 
   903                              <1> 
   903                              <1> 
   903                              <1> 
   903                              <1>  %if %0 >= 2
   903 00000654 8B1D[9E0F0000]      <1>  mov ebx, %2
   903                              <1>  %if %0 >= 3
   903                              <1>  mov ecx, %3
   903                              <1>  %if %0 = 4
   903                              <1>  mov edx, %4
   903                              <1>  %endif
   903                              <1>  %endif
   903                              <1>  %endif
   903 0000065A B803000000          <1>  mov eax, %1
   903                              <1> 
   903 0000065F CD40                <1>  int 40h
   904 00000661 0F8296000000            		jc      CloseFile
   905                                  
   906                                  		; paterns have been loaded here... (04/07/2017)
   907                                  
   908 00000667 BE[B80F0000]            		mov	esi, Header+ModHeader.mhSamples
   909 0000066C 31FF                    		xor     edi, edi
   910                                  CopySamples:
   911 0000066E 668B4616                		mov     ax, [esi+ModSample.msLength]
   912 00000672 86C4                    		xchg    al, ah
   913 00000674 66D1E0                  		shl     ax, 1
   914 00000677 668987[E4140000]        		mov     [ModInfo.SampLen+edi], ax
   915 0000067E 8A4619                  		mov     al, [esi+ModSample.msVolume]
   916 00000681 30E4                    		xor     ah, ah
   917 00000683 668987[9E150000]        		mov     [ModInfo.SampVol+edi], ax
   918 0000068A 668B461A                		mov     ax, [esi+ModSample.msRepeat]
   919 0000068E 86C4                    		xchg    al, ah
   920 00000690 66D1E0                  		shl     ax, 1
   921 00000693 668987[22150000]        		mov     [ModInfo.SampRep+edi], ax
   922 0000069A 668B461C                		mov     ax, [esi+ModSample.msRepLen]
   923 0000069E 86C4                    		xchg    al, ah
   924 000006A0 66D1E0                  		shl     ax, 1
   925 000006A3 668987[60150000]        		mov     [ModInfo.SampRepLen+edi], ax
   926 000006AA 83C61E                  		add     esi, ModSample.size
   927 000006AD 6683C702                		add     di, 2
   928 000006B1 6683FF3E                		cmp     di, 2*31
   929 000006B5 72B7                    		jb      short CopySamples
   930                                  
   931 000006B7 31F6                    		xor     esi, esi
   932                                  AllocSamples:
   933 000006B9 0FB796[E4140000]        		movzx	edx, word [ModInfo.SampLen+esi]
   934 000006C0 09D2                    		or	edx, edx ; byte count
   935 000006C2 7426                    		jz      short NextSample
   936 000006C4 89E8                    		mov	eax, ebp
   937 000006C6 668986[68140000]        		mov	[ModInfo.SampOfs+esi], ax
   938 000006CD C1E810                  		shr	eax, 16
   939 000006D0 668986[A6140000]        		mov	[ModInfo.SampSeg+esi], ax
   940 000006D7 89E9                    		mov	ecx, ebp
   941 000006D9 01D5                    		add	ebp, edx ; next offset for sample 
   942                                  ReadSample:
   943                                  		;mov	ebx, [FileHandle]
   944                                  		;movzx  edx, [ModInfo.SampLen+esi]
   945                                  		;mov    ecx, [ModInfo.SampOfs+esi]
   946                                  
   947                                  		; ebx = File handle
   948                                  		; ecx = Buffer address
   949                                  		; edx = Byte count
   950                                  		sys	_read, [FileHandle]
   950                              <1> 
   950                              <1> 
   950                              <1> 
   950                              <1> 
   950                              <1>  %if %0 >= 2
   950 000006DB 8B1D[9E0F0000]      <1>  mov ebx, %2
   950                              <1>  %if %0 >= 3
   950                              <1>  mov ecx, %3
   950                              <1>  %if %0 = 4
   950                              <1>  mov edx, %4
   950                              <1>  %endif
   950                              <1>  %endif
   950                              <1>  %endif
   950 000006E1 B803000000          <1>  mov eax, %1
   950                              <1> 
   950 000006E6 CD40                <1>  int 40h
   951 000006E8 7213                    		jc      short CloseFile
   952                                  
   953                                  NextSample:
   954 000006EA 6683C602                		add     si, 2
   955 000006EE 6683FE3E                		cmp     si, 2*31
   956 000006F2 72C5                    		jb      short AllocSamples
   957                                  
   958 000006F4 66C705[A20F0000]00-     		mov     word [ErrorInfo], 0
   958 000006FC 00                 
   959                                  CloseFile:      
   960                                  		sys	_close, [FileHandle]
   960                              <1> 
   960                              <1> 
   960                              <1> 
   960                              <1> 
   960                              <1>  %if %0 >= 2
   960 000006FD 8B1D[9E0F0000]      <1>  mov ebx, %2
   960                              <1>  %if %0 >= 3
   960                              <1>  mov ecx, %3
   960                              <1>  %if %0 = 4
   960                              <1>  mov edx, %4
   960                              <1>  %endif
   960                              <1>  %endif
   960                              <1>  %endif
   960 00000703 B806000000          <1>  mov eax, %1
   960                              <1> 
   960 00000708 CD40                <1>  int 40h
   961                                  Failed:         
   962 0000070A 61                      		popad
   963                                  
   964 0000070B C3                      		retn
   965                                  
   966                                  FreeModule:
   967                                  		; Erdogan Tan (13/02/2017)
   968                                  		; nothing to do here for memory de-allocation
   969                                  ClearModInfo:
   970 0000070C 57                      		push	edi
   971 0000070D BF[E2130000]            		mov	edi, ModInfo
   972 00000712 B9FA010000              		mov     ecx, ModInfoRec.size
   973                                  		;cld
   974 00000717 30C0                    		xor     al, al
   975 00000719 F3AA                    		rep     stosb
   976 0000071B 5F                      		pop	edi
   977 0000071C C3                      		retn
   978                                  
   979                                  ;=============================================================================
   980                                  ;               MODPLAY.ASM
   981                                  ;=============================================================================
   982                                  
   983                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   984                                  ;		July 23th, 1993.
   985                                  
   986                                  ; EQUATES
   987                                  
   988                                  NumTracks       equ 4
   989                                  DefTempo        equ 6
   990                                  DefBpm          equ 125
   991                                  MidCRate        equ 8448
   992                                  MixBufSize      equ 4096
   993                                  
   994                                  ; STRUCTURES
   995                                  
   996                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   997 00000000 <res 00000004>          .Samples:	resd 1
   998                                  ;.Position:	resw 1
   999 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
  1000 00000008 <res 00000002>          .Len:		resw 1
  1001 0000000A <res 00000002>          .Repeat:	resw 1
  1002 0000000C <res 00000002>          .RepLen:	resw 1
  1003 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
  1004 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
  1005                                  ;.Error:	resb 1
  1006                                  ;.Reserved:	resb 1 ; 01/10/2017
  1007 00000010 <res 00000002>          .Period:	resw 1 ; Period
  1008 00000012 <res 00000002>          .Pitch:		resw 1 
  1009 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
  1010 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
  1011 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
  1012 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
  1013 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
  1014 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
  1015 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
  1016                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
  1017 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
  1018 0000001E <res 00000006>          .Arp:		resw 3
  1019 00000024 <res 00000002>          .ArpIndex:	resw 1
  1020                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
  1021                                  endstruc
  1022                                  
  1023                                  ; CODE
  1024                                  
  1025                                  ;--------------------------------------------------------------------------
  1026                                  ; updatechannel - update the track using the current effect
  1027                                  ;--------------------------------------------------------------------------
  1028                                  ; 
  1029                                  ;--------------------------------------------------------------------------
  1030                                  ; BeatTrack:  Process the next beat in one track.
  1031                                  ;  In:
  1032                                  ;    ds:di -  Track info Address.
  1033                                  ;--------------------------------------------------------------------------
  1034                                  
  1035                                  ; edi = Track info address
  1036                                  
  1037                                  updatechannel:
  1038                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
  1039                                  
  1040 0000071D 668B5714                		mov     dx, [edi+TrackInfo.Effect]
  1041                                  
  1042                                  		;test   dx, dx
  1043                                  		;je     short None
  1044                                  		;cmp    dh, 00h
  1045                                  		;je     short Arpeggio
  1046                                  		;cmp    dh, 01h
  1047                                  		;je     short PortUp
  1048                                  		;cmp    dh, 02h
  1049                                  		;je     short PortDown
  1050                                  		;cmp    dh, 03h
  1051                                  		;je     TonePort
  1052                                  		;cmp    dh, 04h
  1053                                  		;je     Vibrato
  1054                                  		;cmp    dh, 05h
  1055                                  		;je     PortSlide
  1056                                  		;cmp    dh, 06h
  1057                                  		;je     VibSlide
  1058                                  		;cmp    dh, 0Ah
  1059                                  		;je     VolSlide
  1060                                  		;retn
  1061                                  
  1062 00000721 0FB6C6                  		movzx	eax, dh
  1063 00000724 240F                    		and	al, 0Fh
  1064 00000726 FF2485[640D0000]        		jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
  1065                                  efxnull:
  1066                                  None:           
  1067 0000072D C3                      		retn
  1068                                  efxarpeggio2:
  1069                                  		; 01/10/2017
  1070 0000072E 84D2                    		test    dl, dl
  1071 00000730 74FB                    		jz      short efxnull
  1072                                  Arpeggio:
  1073 00000732 0FB75F24                		movzx   ebx, word [edi+TrackInfo.ArpIndex]
  1074 00000736 668B441F1E              		mov     ax, [edi+TrackInfo.Arp+ebx]
  1075 0000073B 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1076 0000073F 6683C302                		add     bx, 2
  1077 00000743 6683FB06                		cmp     bx, 6
  1078 00000747 7202                    		jb      short SetArpIndex
  1079 00000749 31DB                    		xor     ebx, ebx
  1080                                  SetArpIndex:
  1081 0000074B 66895F24                		mov     [edi+TrackInfo.ArpIndex], bx
  1082 0000074F C3                      		retn
  1083                                  efxportaup:
  1084                                  PortUp:
  1085 00000750 30F6                    		xor     dh, dh
  1086 00000752 668B5F10                		mov     bx, [edi+TrackInfo.Period]
  1087 00000756 6629D3                  		sub     bx, dx
  1088                                  		;cmp	bx, 113
  1089 00000759 6683FB1C                		cmp	bx, 28 ; 01/10/2017 
  1090 0000075D 7D04                    		jge     short NotSmall
  1091                                  		;mov	bx, 113
  1092 0000075F 66BB1C00                		mov	bx, 28 ; 01/10/2017
  1093                                  NotSmall:
  1094 00000763 66895F10                		mov     [edi+TrackInfo.Period], bx
  1095 00000767 6601DB                  		add     bx, bx
  1096 0000076A 66678B87[DC15]          		mov     ax, [PitchTable+bx]
  1097 00000770 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1098 00000774 C3                      		retn
  1099                                  efxportadown:
  1100                                  PortDown:
  1101 00000775 30F6                    		xor     dh, dh
  1102 00000777 668B5F10                		mov     bx, [edi+TrackInfo.Period]
  1103 0000077B 6601D3                  		add     bx, dx
  1104 0000077E 6681FB600D              		cmp	bx, 3424 ; 01/10/2017 
  1105                                  		;cmp	bx, 856
  1106 00000783 7E04                    		jle     short NotBig
  1107                                  		;mov	bx, 856
  1108 00000785 66BB600D                		mov	bx, 3424 ; 01/10/2017
  1109                                  NotBig:         
  1110 00000789 66895F10                		mov     [edi+TrackInfo.Period], bx
  1111 0000078D 6601DB                  		add     bx, bx
  1112 00000790 66678B87[DC15]          		mov     ax, [PitchTable+bx]
  1113 00000796 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1114 0000079A C3                      		retn
  1115                                  efxtoneporta2:
  1116                                  TonePort:
  1117 0000079B 30F6                    		xor     dh, dh
  1118 0000079D 668B4716                		mov     ax, [edi+TrackInfo.PortTo]
  1119 000007A1 668B5F10                		mov     bx, [edi+TrackInfo.Period]
  1120 000007A5 6639C3                  		cmp     bx, ax
  1121 000007A8 7428                    		je      short NoPort
  1122 000007AA 7F0D                    		jg      short PortToUp
  1123                                  PortToDown:     
  1124 000007AC 6601D3                  		add     bx, dx
  1125 000007AF 6639C3                  		cmp     bx, ax
  1126 000007B2 7E0D                    		jle     short SetPort
  1127                                  FixPort:        
  1128 000007B4 6689C3                  		mov     bx, ax
  1129 000007B7 EB08                    		jmp     short SetPort
  1130                                  PortToUp:
  1131 000007B9 6629D3                  		sub     bx, dx
  1132 000007BC 6639C3                  		cmp     bx, ax
  1133 000007BF 7CF3                    		jl      short FixPort
  1134                                  SetPort:        
  1135 000007C1 66895F10                		mov     [edi+TrackInfo.Period], bx
  1136 000007C5 6601DB                  		add     bx, bx
  1137 000007C8 66678B87[DC15]          		mov     ax, [PitchTable+bx]
  1138 000007CE 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1139                                  NoPort:         
  1140 000007D2 C3                      		retn
  1141                                  efxvibrato2:
  1142                                  		; 01/10/2017
  1143                                  Vibrato:
  1144 000007D3 88D6                    		mov     dh, dl
  1145                                  		;and	dl, 0Fh
  1146                                  		;shr	dh, 4
  1147                                  		;shl	dh, 2
  1148 000007D5 6681E20FF0              		and     dx, 0F00Fh
  1149 000007DA C0EE02                  		shr     dh, 2
  1150                                  		;add	[edi+TrackInfo.VibPos], dh
  1151                                  		;mov	dh, [edi+TrackInfo.VibPos]
  1152                                  		;mov	bl, dh
  1153 000007DD 8A5F19                  		mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
  1154 000007E0 007719                  		add	[edi+TrackInfo.VibPos], dh
  1155 000007E3 88DE                    		mov	dh, bl ; 01/10/2017
  1156 000007E5 C0EB02                  		shr     bl, 2
  1157                                  		;and	bx, 1Fh
  1158                                  		;mov	al, [SinTable+bx]
  1159 000007E8 83E31F                  		and	ebx, 1Fh
  1160 000007EB 8A83[4C0E0000]          		mov	al, [SinTable+ebx]
  1161 000007F1 F6E2                    		mul     dl
  1162                                  		;rol	ax, 1
  1163                                  		;xchg	al, ah
  1164                                  		;and	ah, 1
  1165 000007F3 66C1E807                		shr	ax, 7
  1166 000007F7 84F6                    		test    dh, dh
  1167 000007F9 7903                    		jns     short VibUp
  1168 000007FB 66F7D8                  		neg     ax
  1169                                  VibUp:          
  1170 000007FE 66034710                		add     ax, [edi+TrackInfo.Period]
  1171 00000802 6689C3                  		mov	bx, ax
  1172                                  		;movzx	ebx, ax
  1173 00000805 6683FB71                		cmp     bx, 113
  1174                                  		;cmp	bx, 113
  1175 00000809 6683FB1C                		cmp	bx, 28  ; 01/10/2017
  1176 0000080D 7D06                    		jge     short NoLoVib
  1177                                  		;mov	bx, 113
  1178 0000080F 66BB1C00                		mov	bx, 28	; 01/10/2017
  1179 00000813 EB0B                    		jmp	short NoHiVib ; 01/10/2017	
  1180                                  NoLoVib:        
  1181 00000815 6681FB600D              		cmp	bx, 3424 ; 01/10/2017 
  1182                                  		;cmp	bx, 856
  1183 0000081A 7E04                    		jle     short NoHiVib
  1184                                  		;mov	bx, 856
  1185 0000081C 66BB600D                		mov	bx, 3424 ; 01/10/2017
  1186                                  NoHiVib:        
  1187 00000820 6601DB                  		add     bx, bx
  1188                                  		;mov	ax, [PitchTable+bx]
  1189 00000823 668B83[DC150000]        		mov	ax, [PitchTable+ebx] ; 01/10/2017
  1190 0000082A 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1191 0000082E C3                      		retn
  1192                                  efxtoneslide:
  1193                                  PortSlide:
  1194 0000082F E812000000              		call    VolSlide
  1195 00000834 8A5718                  		mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1196 00000837 E95FFFFFFF              		jmp     TonePort  ; efxtoneporta2
  1197                                  efxvibslide:
  1198                                  VibSlide:
  1199 0000083C E805000000              		call    VolSlide
  1200 00000841 8A571A                  		mov     dl, [edi+TrackInfo.VibParm]
  1201 00000844 EB8D                    		jmp     short Vibrato  ; efxvibrato2
  1202                                  efxvolslide:
  1203                                  VolSlide:
  1204 00000846 88D6                    		mov     dh, dl
  1205 00000848 80E20F                  		and     dl, 0Fh
  1206 0000084B C0EE04                  		shr     dh, 4
  1207 0000084E 8A470E                  		mov     al, [edi+TrackInfo.Volume]
  1208 00000851 28D0                    		sub     al, dl
  1209 00000853 7D02                    		jge     short NoLoVol
  1210 00000855 30C0                    		xor     al, al
  1211                                  NoLoVol:        
  1212 00000857 00F0                    		add     al, dh
  1213 00000859 3C40                    		cmp     al, 64
  1214 0000085B 7602                    		jbe     short NoHiVol
  1215 0000085D B040                    		mov     al, 64
  1216                                  NoHiVol:        
  1217 0000085F 88470E                  		mov     [edi+TrackInfo.Volume], al
  1218 00000862 C3                      		retn
  1219                                  
  1220                                  efxtremolo2:
  1221                                  		; 01/10/2017 (TMODPLAY.ASM)
  1222                                  Tremolo:
  1223 00000863 88D6                    		mov     dh, dl
  1224 00000865 6681E20FF0              		and     dx, 0F00Fh
  1225 0000086A C0EE02                  		shr     dh, 2
  1226 0000086D 8A5F1B                  		mov	bl, [edi+TrackInfo.TremPos]
  1227 00000870 00771B                  		add	[edi+TrackInfo.TremPos], dh
  1228 00000873 88DE                    		mov	dh, bl
  1229 00000875 C0EB02                  		shr     bl, 2
  1230                                  		; 01/10/2017 - TRDOS 386
  1231                                  		;and	bx, 1Fh
  1232 00000878 83E31F                  		and	ebx, 1Fh 
  1233                                  		;mov	al, [SinTable+bx]
  1234 0000087B 8A83[4C0E0000]          		mov     al, [SinTable+ebx]
  1235 00000881 F6E2                    		mul     dl
  1236 00000883 66C1E806                		shr	ax, 6
  1237 00000887 84F6                    		test    dh, dh
  1238 00000889 7D03                    		jge	short Tremolo_1 ; efxtremolof2
  1239 0000088B 66F7D8                  		neg     ax
  1240                                  efxtremolof2:
  1241                                  Tremolo_1:      
  1242 0000088E 8A670E                  		mov	ah, [edi+TrackInfo.Volume]    
  1243 00000891 00E0                    		add     al, ah
  1244 00000893 7D02                    		jge     short Tremolo_2 ; efxtremolof3
  1245 00000895 30C0                    		xor     al, al
  1246                                  efxtremolof3:
  1247                                  Tremolo_2:       
  1248 00000897 3C40                    		cmp     al, 64 ; 40h
  1249 00000899 7E02                    		jle     short Tremolo_3 ; efxtremolof4
  1250 0000089B B040                    		mov     al, 64 ; 40h
  1251                                  efxtremolof4:
  1252                                  Tremolo_3:       
  1253 0000089D 28E0                    		sub	al, ah  ; ****** 
  1254 0000089F 88470F                  		mov     [edi+TrackInfo.VolDiff], al
  1255 000008A2 C3                      		retn	
  1256                                  
  1257                                  ;--------------------------------------------------------------------------
  1258                                  ; readchannel - read the next note event from the pattern sheet
  1259                                  ;--------------------------------------------------------------------------
  1260                                  ;
  1261                                  ;--------------------------------------------------------------------------
  1262                                  ; GetTrack:   Get the next Note from a pattern.
  1263                                  ;  In:
  1264                                  ;    ds:di -  Track info Address.
  1265                                  ;    es:si -  Pattern Note Address.
  1266                                  ; Out:
  1267                                  ;    es:si -  The Next Pattern Note address.
  1268                                  ;--------------------------------------------------------------------------
  1269                                  
  1270                                  ; esi = Pattern note address
  1271                                  ; edi = Track info address
  1272                                  
  1273                                  readchannel:
  1274                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1275 000008A3 66AD                    		lodsw
  1276 000008A5 86C4                    		xchg    al, ah
  1277 000008A7 88E3                    		mov	bl, ah
  1278 000008A9 80E40F                  		and     ah, 0Fh
  1279 000008AC 6689C1                  		mov     cx, ax
  1280 000008AF 66AD                    		lodsw
  1281 000008B1 86C4                    		xchg    al, ah
  1282 000008B3 88E7                    		mov     bh, ah
  1283 000008B5 80E40F                  		and     ah, 0Fh
  1284 000008B8 6689C2                  		mov     dx, ax
  1285 000008BB 66895714                		mov     [edi+TrackInfo.Effect], dx
  1286                                  		; 01/10/2017 - TRDOS 386
  1287                                  		;and	bl, 0F0h
  1288 000008BF 81E3F0FF0000            		and	ebx, 0FFF0h
  1289 000008C5 C0EF04                  		shr     bh, 4
  1290 000008C8 08FB                    		or      bl, bh
  1291 000008CA 7446                    		je      short SetPeriod
  1292                                  SetSample:
  1293 000008CC 30FF                    		xor	bh, bh
  1294                                  		;and	ebx, 0FFh
  1295 000008CE FECB                    		dec     bl
  1296 000008D0 01DB                    		add     ebx, ebx
  1297 000008D2 668B83[9E150000]        		mov     ax, [ModInfo.SampVol+ebx]
  1298 000008D9 88470E                  		mov     [edi+TrackInfo.Volume], al
  1299 000008DC 668B83[68140000]        		mov     ax, [ModInfo.SampOfs+ebx]
  1300 000008E3 668907                  		mov     [edi+TrackInfo.Samples], ax
  1301 000008E6 668B83[A6140000]        		mov     ax, [ModInfo.SampSeg+ebx]
  1302 000008ED 66894702                		mov     [edi+TrackInfo.Samples+2], ax
  1303 000008F1 668B83[E4140000]        		mov     ax, [ModInfo.SampLen+ebx]
  1304 000008F8 66894708                		mov     [edi+TrackInfo.Len], ax
  1305 000008FC 668B83[22150000]        		mov     ax, [ModInfo.SampRep+ebx]
  1306 00000903 6689470A                		mov     [edi+TrackInfo.Repeat], ax
  1307 00000907 668B83[60150000]        		mov     ax, [ModInfo.SampRepLen+ebx]
  1308 0000090E 6689470C                		mov     [edi+TrackInfo.RepLen], ax
  1309                                  SetPeriod:      
  1310 00000912 6685C9                  		test    cx, cx
  1311 00000915 7425                    		jz      short SetEffect
  1312                                  
  1313 00000917 66894F16                		mov     [edi+TrackInfo.PortTo], cx ; *
  1314                                  		
  1315 0000091B 80FE03                  		cmp     dh, 03h
  1316                                  		;je	short SetEffect
  1317 0000091E 7428                    		je	short efxtoneporta ; 01/10/2017
  1318                                  
  1319 00000920 66894F10                		mov     [edi+TrackInfo.Period], cx
  1320                                  		;movzx	ebx, cx
  1321 00000924 6689CB                  		mov     bx, cx
  1322 00000927 6601DB                  		add     bx, bx
  1323                                  		;mov	ax, [PitchTable+bx]
  1324 0000092A 668B83[DC150000]        		mov	ax, [PitchTable+ebx] ; 01/10/2017
  1325 00000931 66894712                		mov     [edi+TrackInfo.Pitch], ax
  1326 00000935 C7470400000000          		mov     dword [edi+TrackInfo.Position], 0
  1327                                  SetEffect:
  1328                                  		;test	dx, dx
  1329                                  		;je	short InitNone
  1330                                  		;cmp	dh, 00h
  1331                                  		;je	InitArpeggio
  1332                                  		;cmp	dh, 03h
  1333                                  		;je	short InitTonePort
  1334                                  		;cmp	dh, 04h
  1335                                  		;je	short InitVibrato
  1336                                  		;cmp	dh, 09h
  1337                                  		;je	short SampleOfs
  1338                                  		;cmp	dh, 0Bh
  1339                                  		;je	short PosJump
  1340                                  		;cmp	dh, 0Ch
  1341                                  		;je	short SetVolume
  1342                                  		;cmp	dh, 0Dh
  1343                                  		;je	short Break
  1344                                  		;cmp	dh, 0Fh
  1345                                  		;je	SetSpeed
  1346                                  		;retn
  1347                                  
  1348                                  		; 01/10/2017 (TMODPLAY.ASM)
  1349                                  		
  1350                                  		; dx = [di+TrackInfo.Effect]
  1351                                  		
  1352 0000093C 0FB6C6                  		movzx	eax, dh
  1353 0000093F 240F                    		and	al, 0Fh
  1354 00000941 FF2485[240D0000]        		jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1355                                  ;efxnull:
  1356                                  ;InitNone:
  1357                                  ;		retn
  1358                                  efxtoneporta:
  1359                                  		; 01/10/2017
  1360                                  		; cx = period
  1361                                  		;mov	[edi+TrackInfo.PortTo], cx ; *
  1362                                  InitTonePort:
  1363 00000948 84D2                    		test    dl, dl
  1364 0000094A 7503                    		jnz     short SetPortParm
  1365 0000094C 8A5718                  		mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1366                                  SetPortParm:    
  1367 0000094F 885718                  		mov     [edi+TrackInfo.PortParm], dl
  1368 00000952 66895714                		mov     [edi+TrackInfo.Effect], dx
  1369 00000956 C3                      		retn
  1370                                  efxvibrato:
  1371                                  InitVibrato:
  1372 00000957 8A471A                  		mov     al, [edi+TrackInfo.VibParm]
  1373 0000095A 88C4                    		mov     ah, al
  1374                                  		;and	al, 0Fh
  1375                                  		;and	ah, 0F0h
  1376 0000095C 66250FF0                		and	ax, 0F00Fh
  1377 00000960 F6C20F                  		test    dl, 0Fh
  1378 00000963 7502                    		jne     short OkDepth
  1379 00000965 08C2                    		or      dl, al
  1380                                  OkDepth:        
  1381 00000967 F6C2F0                  		test    dl, 0F0h
  1382 0000096A 7502                    		jnz     short OkRate
  1383 0000096C 08E2                    		or      dl, ah
  1384                                  OkRate:         
  1385 0000096E 88571A                  		mov     [edi+TrackInfo.VibParm], dl
  1386 00000971 66895714                		mov     [edi+TrackInfo.Effect], dx
  1387 00000975 6685C9                  		test    cx, cx
  1388 00000978 7404                    		jz      short OkPos
  1389 0000097A C6471900                		mov     byte [edi+TrackInfo.VibPos], 0
  1390                                  OkPos:          
  1391 0000097E C3                      		retn
  1392                                  efxsampoffset:
  1393                                  		; 01/10/2017 ; *******
  1394                                  SampleOfs:         
  1395                                  ;		test    dl, dl
  1396                                  ;		jnz     short SetSampleOfs
  1397                                  ;		mov     dl, [edi+TrackInfo.OldSampOfs]
  1398                                  ;SetSampleOfs:
  1399                                  ;		mov     [edi+TrackInfo.OldSampOfs], dl
  1400 0000097F 88D6                    		mov     dh, dl
  1401 00000981 81E200FF0000            		and 	edx, 0FF00h ; 05/03/2017
  1402 00000987 895704                  		mov     [edi+TrackInfo.Position], edx
  1403 0000098A C3                      		retn
  1404                                  efxpattjump:
  1405                                  PosJump:
  1406 0000098B 8815[9E810000]          		mov     [OrderPos], dl
  1407 00000991 C605[A2810000]40        		mov     byte [Row], 64
  1408 00000998 C3                      		retn
  1409                                  efxsetvolume:
  1410                                  SetVolume:
  1411 00000999 80FA40                  		cmp     dl, 64
  1412 0000099C 7602                    		jbe     short OkVol
  1413 0000099E B240                    		mov     dl, 64
  1414                                  OkVol:
  1415                                  		; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1416 000009A0 30F6                    		xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1417                                  		;mov	[edi+TrackInfo.Volume], dl
  1418 000009A2 6689570E                		mov	[edi+TrackInfo.Volume], dx 
  1419 000009A6 C3                      		retn
  1420                                  efxbreak:
  1421                                  Break:
  1422 000009A7 88D6                    		mov     dh, dl
  1423 000009A9 80E20F                  		and     dl, 0Fh
  1424 000009AC C0EE04                  		shr     dh, 4
  1425 000009AF 00F6                    		add     dh, dh
  1426 000009B1 00F2                    		add     dl, dh
  1427 000009B3 C0E602                  		shl     dh, 2
  1428 000009B6 00F2                    		add     dl, dh
  1429 000009B8 8815[A3810000]          		mov     [BreakRow], dl
  1430 000009BE C605[A2810000]40        		mov     byte [Row], 64
  1431 000009C5 C3                      		retn
  1432                                  efxsetspeed:
  1433                                  SetSpeed:
  1434 000009C6 84D2                    		test    dl,dl
  1435 000009C8 7432                    		je      Skip
  1436 000009CA 80FA1F                  		cmp     dl,31
  1437 000009CD 770D                    		ja      short SetBpm
  1438                                  SetTempo:       
  1439 000009CF 8815[9F810000]          		mov     [Tempo], dl
  1440 000009D5 8815[A0810000]          		mov     [TempoWait], dl
  1441 000009DB C3                      		retn
  1442                                  SetBpm:
  1443 000009DC 8815[A1810000]          		mov     [Bpm], dl
  1444 000009E2 B067                    		mov     al, 103
  1445 000009E4 F6E2                    		mul     dl
  1446 000009E6 88E3                    		mov     bl, ah
  1447 000009E8 30FF                    		xor     bh, bh
  1448 000009EA 66A1[E0130000]          		mov     ax, [MixSpeed]
  1449 000009F0 6631D2                  		xor     dx, dx
  1450 000009F3 66F7F3                  		div     bx
  1451 000009F6 66A3[A4810000]          		mov     [BpmSamples], ax
  1452                                  Skip:           
  1453 000009FC C3                      		retn
  1454                                  efxarpeggio:
  1455                                  		; 01/10/2017
  1456 000009FD 84D2                    		test    dl, dl
  1457                                  		;je	efxnull
  1458 000009FF 74FB                    		je	short Skip
  1459                                  InitArpeggio:
  1460 00000A01 88D6                    		mov     dh, dl
  1461 00000A03 80E20F                  		and     dl, 0Fh
  1462 00000A06 C0EE04                  		shr     dh, 4
  1463                                  		; 01/10/2017
  1464                                  		;mov	cx, 36
  1465 00000A09 66B95400                		mov	cx, 84 ; 84 notes/periods
  1466 00000A0D 31DB                    		xor     ebx, ebx
  1467 00000A0F 668B4710                		mov     ax, [edi+TrackInfo.Period]
  1468                                  gt_ScanPeriod:
  1469                                  		;cmp	ax, [PeriodTable+bx]
  1470 00000A13 663B83[A40D0000]        		cmp	ax, [PeriodTable+ebx]
  1471 00000A1A 7306                    		jae     short SetArp
  1472 00000A1C 6683C302                		add     bx, 2
  1473 00000A20 E2F1                    		loop    gt_ScanPeriod
  1474                                  SetArp:         
  1475 00000A22 6601D2                  		add     dx, dx
  1476 00000A25 00DE                    		add     dh, bl
  1477 00000A27 00DA                    		add     dl, bl
  1478                                  		; 01/10/2017
  1479                                  		;mov	bx, [PeriodTable+bx]
  1480 00000A29 668B9B[A40D0000]        		mov	bx, [PeriodTable+ebx]
  1481                                  		;add	bx, bx
  1482 00000A30 01DB                    		add	ebx, ebx
  1483                                  		;mov	ax, [PitchTable+bx]
  1484 00000A32 668B83[DC150000]        		mov	ax, [PitchTable+ebx]
  1485 00000A39 6689471E                		mov     [edi+TrackInfo.Arp], ax
  1486 00000A3D 88F3                    		mov     bl, dh
  1487 00000A3F 30FF                    		xor     bh, bh
  1488 00000A41 668B9B[A40D0000]        		mov	bx, [PeriodTable+ebx]
  1489                                  		;add	bx, bx
  1490 00000A48 01DB                    		add	ebx, ebx
  1491                                  		;mov	ax, [PitchTable+bx]
  1492 00000A4A 668B83[DC150000]        		mov	ax, [PitchTable+ebx]
  1493 00000A51 66894720                		mov     [edi+TrackInfo.Arp+2], ax
  1494 00000A55 88D3                    		mov     bl, dl
  1495 00000A57 30FF                    		xor     bh, bh
  1496 00000A59 668B9B[A40D0000]        		mov	bx, [PeriodTable+ebx]
  1497                                  		;add	bx, bx
  1498 00000A60 01DB                    		add	ebx, ebx
  1499                                  		;mov	ax, [PitchTable+bx]
  1500 00000A62 668B83[DC150000]        		mov	ax, [PitchTable+ebx]
  1501 00000A69 66894722                		mov     [edi+TrackInfo.Arp+4], ax
  1502 00000A6D 66C747240000            		mov     word [edi+TrackInfo.ArpIndex], 0
  1503 00000A73 C3                      		retn
  1504                                  
  1505                                  efxtremolo:
  1506                                  		; 01/10/2017 (TMODPLAY.ASM)
  1507                                  InitTremolo:
  1508 00000A74 8A471C                  		mov     al, [edi+TrackInfo.TremParm]
  1509 00000A77 88C4                    		mov     ah, al
  1510 00000A79 66250FF0                		and     ax, 0F00Fh
  1511 00000A7D F6C20F                  		test    dl, 0Fh
  1512 00000A80 7502                    		jnz     short InitTremolo_1 ; efxtremolof0
  1513 00000A82 08C2                    		or      dl, al
  1514                                  efxtremolof0:
  1515                                  InitTremolo_1: 
  1516 00000A84 F6C2F0                  		test    dl, 0F0h
  1517 00000A87 7502                    		jnz     short InitTremolo_2 ; efxtremolof1
  1518 00000A89 08E2                    		or      dl, ah
  1519                                  efxtremolof1:
  1520                                  InitTremolo_2:
  1521 00000A8B 88571C                  		mov     [edi+TrackInfo.TremParm], dl
  1522 00000A8E 66895714                		mov     [edi+TrackInfo.Effect], dx
  1523 00000A92 C3                      		retn
  1524                                  
  1525                                  ;--------------------------------------------------------------------------
  1526                                  ; pollmodule - polls the module player
  1527                                  ;--------------------------------------------------------------------------
  1528                                  ;--------------------------------------------------------------------------
  1529                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1530                                  ;--------------------------------------------------------------------------
  1531                                  
  1532                                  pollmodule:
  1533                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1534 00000A93 FE0D[A0810000]          		dec     byte [TempoWait]
  1535 00000A99 7415                    		jz      short GetTracks
  1536                                  
  1537 00000A9B B904000000              		mov	ecx, NumTracks
  1538 00000AA0 BF[B4810000]            		mov	edi, Tracks
  1539                                  BeatTracks:
  1540 00000AA5 E873FCFFFF              		call	BeatTrack	
  1541 00000AAA 83C726                  		add	edi, TrackInfo.size
  1542 00000AAD E2F6                    		loop	BeatTracks
  1543 00000AAF C3                      		retn
  1544                                  GetTracks:
  1545 00000AB0 A0[9F810000]            		mov     al, [Tempo]
  1546 00000AB5 A2[A0810000]            		mov     [TempoWait], al
  1547                                  
  1548 00000ABA 8B35[B0810000]          		mov	esi, [Note]
  1549 00000AC0 803D[A2810000]40        		cmp     byte [Row], 64
  1550 00000AC7 7263                    		jb      short NoPattWrap
  1551                                  
  1552 00000AC9 8B35[64140000]          		mov	esi, [ModInfo.Patterns]
  1553 00000ACF 8A1D[9E810000]          		mov     bl, [OrderPos]
  1554 00000AD5 3A1D[E2130000]          		cmp     bl, [ModInfo.OrderLen]
  1555 00000ADB 7214                    		jb      short NoOrderWrap
  1556 00000ADD 8A1D[E3130000]          		mov     bl, [ModInfo.ReStart]
  1557 00000AE3 881D[9E810000]          		mov     [OrderPos], bl
  1558 00000AE9 3A1D[E2130000]          		cmp     bl, [ModInfo.OrderLen]
  1559 00000AEF 735D                    		jae     short NoUpdate
  1560                                  NoOrderWrap:    
  1561                                  		;xor	bh, bh
  1562 00000AF1 81E3FF000000            		and	ebx, 0FFh
  1563 00000AF7 8A9B[E4130000]          		mov     bl, [ModInfo.Order+ebx]
  1564 00000AFD C1E30A                  		shl     ebx, 10 ; *1024
  1565 00000B00 01DE                    		add     esi, ebx
  1566 00000B02 8A1D[A3810000]          		mov     bl, [BreakRow]
  1567 00000B08 881D[A2810000]          		mov     [Row], bl
  1568                                  		;xor	bh, bh
  1569 00000B0E 81E3FF000000            		and	ebx, 0FFh
  1570 00000B14 883D[A3810000]          		mov     [BreakRow], bh ; 0
  1571 00000B1A 66C1E304                		shl     bx, 4
  1572 00000B1E 01DE                    		add     esi, ebx
  1573 00000B20 8935[B0810000]          		mov     [Note], esi
  1574 00000B26 FE05[9E810000]          		inc     byte [OrderPos]
  1575                                  NoPattWrap:     
  1576 00000B2C FE05[A2810000]          		inc     byte [Row]
  1577                                  
  1578                                  		;cld
  1579 00000B32 B904000000              		mov	ecx, NumTracks
  1580 00000B37 BF[B4810000]            		mov	edi, Tracks
  1581                                  GetTracks_next:
  1582 00000B3C 51                      		push	ecx		
  1583 00000B3D E861FDFFFF              		call	GetTrack ; readchannel
  1584 00000B42 59                      		pop	ecx
  1585 00000B43 83C726                  		add	edi, TrackInfo.size
  1586 00000B46 E2F4                    		loop	GetTracks_next
  1587                                  
  1588 00000B48 8935[B0810000]          		mov     [Note], esi
  1589                                  NoUpdate:
  1590 00000B4E C3                      		retn
  1591                                  
  1592                                  ;--------------------------------------------------------------------------
  1593                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1594                                  ;  In:
  1595                                  ;   ds:si -  Track Info Address.
  1596                                  ;   ds:di -  Buffer Address.
  1597                                  ;    cx   -  Buffer Size.
  1598                                  ;--------------------------------------------------------------------------
  1599                                  
  1600                                  ; esi = Track info address
  1601                                  ; edi = Buffer address
  1602                                  ; ecx = Buffer size
  1603                                  
  1604                                  MixTrack:
  1605 00000B4F 66837E0C02              		cmp     word [esi+TrackInfo.RepLen], 2
  1606 00000B54 7752                    		ja      short MixLooped
  1607                                  MixNonLooped:   
  1608 00000B56 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1609 00000B58 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1610 00000B5B 0FB76E08                		movzx   ebp, word [esi+TrackInfo.Len]
  1611 00000B5F 52                      		push    edx
  1612 00000B60 56                      		push    esi
  1613 00000B61 01D3                    		add     ebx, edx
  1614 00000B63 01D5                    		add     ebp, edx
  1615 00000B65 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1616                                  		; 01/10/2017
  1617                                  		;mov	al, [esi+TrackInfo.Volume]
  1618 00000B69 668B460E                		mov	ax, [esi+TrackInfo.Volume]
  1619                                  		; ah = [esi+TrackInfo.VolDiff]
  1620 00000B6D 00E0                    		add	al, ah ; ****** 
  1621 00000B6F C6460F00                		mov	byte [esi+TrackInfo.VolDiff], 0
  1622 00000B73 8A661D                  		mov     ah, [esi+TrackInfo.Error]
  1623 00000B76 89DE                    		mov     esi, ebx
  1624 00000B78 31DB                    		xor	ebx, ebx ; 01/10/2017 ; *
  1625 00000B7A 88C7                    		mov     bh, al
  1626 00000B7C 88D0                    		mov     al, dl
  1627 00000B7E 88F2                    		mov     dl, dh
  1628                                  		;xor	dh, dh
  1629 00000B80 81E2FF000000            		and	edx, 0FFh
  1630                                  nlMixSamp:      
  1631 00000B86 39EE                    		cmp     esi, ebp
  1632 00000B88 7311                    		jae     short nlMixBye
  1633 00000B8A 8A1E                    		mov     bl, [esi]
  1634                                  		;mov	bl, [VolTable+bx]
  1635 00000B8C 8A9B[9E300000]          		mov	bl, [VolTable+ebx] ; 01/10/2017 ; *		
  1636 00000B92 001F                    		add     [edi], bl
  1637 00000B94 47                      		inc     edi
  1638 00000B95 00C4                    		add     ah, al
  1639 00000B97 11D6                    		adc     esi, edx
  1640 00000B99 E2EB                    		loop    nlMixSamp
  1641                                  nlMixBye:       
  1642 00000B9B 89F3                    		mov     ebx, esi
  1643 00000B9D 5E                      		pop     esi
  1644 00000B9E 5A                      		pop     edx
  1645 00000B9F 29D3                    		sub     ebx, edx
  1646 00000BA1 895E04                  		mov     [esi+TrackInfo.Position], ebx
  1647 00000BA4 88661D                  		mov     [esi+TrackInfo.Error], ah
  1648 00000BA7 C3                      		retn
  1649                                  MixLooped:
  1650 00000BA8 8B16                    		mov	edx, [esi+TrackInfo.Samples]
  1651 00000BAA 8B5E04                  		mov	ebx, [esi+TrackInfo.Position]
  1652 00000BAD 0FB76E0C                		movzx	ebp, word [esi+TrackInfo.RepLen]
  1653 00000BB1 892D[AC810000]          		mov     [BufRep], ebp
  1654 00000BB7 036E0A                  		add     ebp, [esi+TrackInfo.Repeat]
  1655 00000BBA 52                      		push    edx
  1656 00000BBB 56                      		push    esi
  1657 00000BBC 01D3                    		add     ebx, edx
  1658 00000BBE 01D5                    		add     ebp, edx
  1659 00000BC0 668B5612                		mov     dx, [esi+TrackInfo.Pitch]
  1660                                  		; 01/10/2017
  1661                                  		;mov	al, [esi+TrackInfo.Volume]
  1662 00000BC4 668B460E                		mov	ax, [esi+TrackInfo.Volume]
  1663                                  		; ah = [esi+TrackInfo.VolDiff]
  1664 00000BC8 00E0                    		add	al, ah ; ****** 
  1665 00000BCA C6460F00                		mov	byte [esi+TrackInfo.VolDiff], 0
  1666 00000BCE 8A661D                  		mov     ah, [esi+TrackInfo.Error]
  1667                                  		;mov	si, bx
  1668 00000BD1 89DE                    		mov	esi, ebx ; 04/09/2017
  1669 00000BD3 31DB                    		xor	ebx, ebx ; 01/10/2017 ; *
  1670 00000BD5 88C7                    		mov     bh, al
  1671 00000BD7 88D0                    		mov     al, dl
  1672 00000BD9 88F2                    		mov     dl, dh
  1673                                  		;xor	dh, dh
  1674 00000BDB 81E2FF000000            		and	edx, 0FFh
  1675                                  lpMixSamp:      
  1676 00000BE1 39EE                    		cmp     esi, ebp
  1677 00000BE3 7206                    		jb      short lpMixNow
  1678 00000BE5 2B35[AC810000]          		sub     esi, [BufRep]
  1679                                  lpMixNow:       
  1680 00000BEB 8A1E                    		mov     bl, [esi]
  1681                                  		;mov	bl, [VolTable+bx]
  1682 00000BED 8A9B[9E300000]          		mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1683 00000BF3 001F                    		add     [edi], bl
  1684 00000BF5 47                      		inc     edi
  1685 00000BF6 00C4                    		add     ah, al
  1686 00000BF8 11D6                    		adc	esi, edx
  1687 00000BFA E2E5                    		loop    lpMixSamp
  1688                                  lpMixBye:       
  1689                                  ;		mov     ebx, esi
  1690                                  ;		pop     esi
  1691                                  ;		pop     edx
  1692                                  ;		sub     ebx, edx
  1693                                  ;		mov     [esi+TrackInfo.Position], ebx
  1694                                  ;		mov     [esi+TrackInfo.Error], ah
  1695                                  ;		retn
  1696 00000BFC EB9D                    		jmp	short nlMixBye
  1697                                  
  1698                                  ;--------------------------------------------------------------------------
  1699                                  ; mixpoll - updates the output buffer
  1700                                  ;--------------------------------------------------------------------------
  1701                                  ;
  1702                                  ;--------------------------------------------------------------------------
  1703                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1704                                  ;  In:
  1705                                  ;    Buffer  - Buffer Address.
  1706                                  ;    Count   - Buffer Size.
  1707                                  ;--------------------------------------------------------------------------
  1708                                  
  1709                                  mixpoll:
  1710                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1711                                  		; edi = buffer address
  1712                                  		; ebx = count
  1713                                  
  1714 00000BFE 60                      		pushad
  1715                                  
  1716                                  		;cld
  1717                                  NextChunk:      
  1718 00000BFF 66833D[AA810000]00      		cmp     word [BufLen], 0
  1719 00000C07 7546                    		jne     short CopyChunk
  1720                                  
  1721 00000C09 53                      		push    ebx
  1722 00000C0A 57                      		push    edi
  1723                                  MixChunk:       
  1724 00000C0B BF[9E710000]            		mov	edi, MixBuffer
  1725 00000C10 0FB70D[A4810000]        		movzx	ecx, word [BpmSamples]
  1726                                  		;mov	cx, [BpmSamples]
  1727 00000C17 893D[A6810000]          		mov     [BufPtr], edi
  1728 00000C1D 66890D[AA810000]        		mov     [BufLen], cx
  1729                                  
  1730 00000C24 B080                    		mov     al, 80h
  1731 00000C26 F3AA                    		rep     stosb
  1732                                  
  1733                                  		;mov	cx, NumTracks
  1734 00000C28 B104                    		mov	cl, NumTracks ; 01/10/2017
  1735 00000C2A BE[8E810000]            		mov	esi, Tracks - TrackInfo.size
  1736                                  GetSamples_next:
  1737 00000C2F 51                      		push	ecx
  1738 00000C30 83C626                  		add	esi, TrackInfo.size
  1739 00000C33 668B0D[AA810000]        		mov	cx, [BufLen]
  1740 00000C3A 8B3D[A6810000]          		mov	edi, [BufPtr]
  1741 00000C40 E80AFFFFFF              		call	MixTrack
  1742 00000C45 59                      		pop	ecx
  1743 00000C46 E2E7                    		loop	GetSamples_next		
  1744                                  
  1745 00000C48 E846FEFFFF              		call    UpdateTracks
  1746                                  
  1747 00000C4D 5F                      		pop     edi
  1748 00000C4E 5B                      		pop     ebx
  1749                                  CopyChunk:      
  1750                                  		;mov	cx, [BufLen]
  1751 00000C4F 0FB70D[AA810000]        		movzx	ecx, word [BufLen]
  1752 00000C56 39D9                    		cmp	ecx, ebx
  1753                                  		;cmp	cx, bx
  1754 00000C58 7602                    		jbe     short MoveChunk
  1755                                  		;mov	cx, bx
  1756 00000C5A 89D9                    		mov     ecx, ebx
  1757                                  MoveChunk:
  1758 00000C5C 8B35[A6810000]          		mov     esi, [BufPtr]
  1759 00000C62 010D[A6810000]          		add     [BufPtr], ecx
  1760 00000C68 66290D[AA810000]        		sub     [BufLen], cx
  1761 00000C6F 29CB                    		sub     ebx, ecx
  1762 00000C71 F3A4                    		rep     movsb
  1763 00000C73 85DB                    		test    ebx, ebx
  1764 00000C75 7588                    		jnz     short NextChunk
  1765                                  
  1766 00000C77 61                      		popad
  1767 00000C78 C3                      		retn
  1768                                  
  1769                                  ;--------------------------------------------------------------------------
  1770                                  ; StartPlaying: Initializes the Sound System.
  1771                                  ;  In:
  1772                                  ;   Module Information Resources.
  1773                                  ;--------------------------------------------------------------------------
  1774                                  
  1775                                  StartPlaying:
  1776 00000C79 60                      		pushad
  1777                                  SetModParms:    
  1778 00000C7A C605[9E810000]00        		mov     byte [OrderPos], 0
  1779 00000C81 C605[9F810000]06        		mov     byte [Tempo], DefTempo
  1780 00000C88 C605[A0810000]06        		mov     byte [TempoWait], DefTempo
  1781 00000C8F C605[A1810000]7D        		mov     byte [Bpm], DefBpm
  1782 00000C96 C605[A2810000]40        		mov     byte [Row], 64
  1783 00000C9D C605[A3810000]00        		mov     byte [BreakRow], 0
  1784 00000CA4 66A1[E0130000]          		mov     ax, [MixSpeed]
  1785 00000CAA 31D2                    		xor     edx, edx
  1786 00000CAC 66BB3200                		mov     bx, 24*DefBpm/60
  1787 00000CB0 66F7F3                  		div     bx
  1788 00000CB3 66A3[A4810000]          		mov     [BpmSamples], ax
  1789                                  ClearTracks:    
  1790 00000CB9 BF[B4810000]            		mov     edi, Tracks
  1791 00000CBE B998000000              		mov     ecx, NumTracks*TrackInfo.size
  1792 00000CC3 31C0                    		xor     eax, eax
  1793                                  		;cld
  1794 00000CC5 F3AA                    		rep     stosb
  1795                                  
  1796 00000CC7 A3[A6810000]            		mov     [BufPtr], eax
  1797 00000CCC 66A3[AA810000]          		mov     [BufLen], ax
  1798                                  MakePitch:
  1799 00000CD2 66B80021                		mov     ax, MidCRate
  1800 00000CD6 66BBAC01                		mov     bx, 428
  1801 00000CDA 66F7E3                  		mul     bx
  1802 00000CDD 66F735[E0130000]        		div     word [MixSpeed]
  1803 00000CE4 30F6                    		xor     dh, dh
  1804 00000CE6 88E2                    		mov     dl, ah
  1805 00000CE8 88C4                    		mov     ah, al
  1806 00000CEA 30C0                    		xor     al, al
  1807                                  		;mov	cx, 857
  1808 00000CEC 66B9610D                		mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1809 00000CF0 31DB                    		xor     ebx, ebx
  1810 00000CF2 BF[DC150000]            		mov     edi, PitchTable
  1811                                  PitchLoop:      
  1812 00000CF7 50                      		push    eax
  1813 00000CF8 52                      		push    edx
  1814 00000CF9 6639DA                  		cmp     dx, bx
  1815 00000CFC 7303                    		jae     short NoDiv
  1816 00000CFE 66F7F3                  		div     bx
  1817                                  NoDiv:          
  1818 00000D01 66AB                    		stosw
  1819 00000D03 5A                      		pop     edx
  1820 00000D04 58                      		pop     eax
  1821 00000D05 6643                    		inc     bx
  1822 00000D07 E2EE                    		loop    PitchLoop
  1823                                  MakeVolume:     
  1824 00000D09 66B90041                		mov     cx, 16640
  1825 00000D0D 89CB                    		mov     ebx, ecx
  1826                                  VolLoop:
  1827 00000D0F 664B                    		dec     bx
  1828 00000D11 88D8                    		mov     al, bl
  1829 00000D13 F6EF                    		imul    bh
  1830                                  		;mov	[VolTable+bx], ah
  1831 00000D15 88A3[9E300000]          		mov     [VolTable+ebx], ah
  1832 00000D1B E2F2                    		loop    VolLoop
  1833                                  
  1834 00000D1D 61                      		popad
  1835                                  		;retn
  1836                                  
  1837                                  ;--------------------------------------------------------------------------
  1838                                  ; StopPlaying: ShutDown the Sound System.
  1839                                  ;--------------------------------------------------------------------------
  1840                                  
  1841                                  StopPlaying:
  1842 00000D1E C3                      		retn
  1843                                  
  1844                                  ;=============================================================================
  1845                                  ;               preinitialized data
  1846                                  ;=============================================================================
  1847                                  
  1848                                  ;=============================================================================
  1849                                  ;               SB.ASM - DATA
  1850                                  ;=============================================================================
  1851                                  
  1852 00000D1F 2002                    SbAddr:		dw      220h
  1853 00000D21 07                      SbIrq:		db      7
  1854                                  ;Srbs:		db	0 
  1855                                  
  1856                                  ;=============================================================================
  1857                                  ; Protracker effects stuff
  1858                                  ;=============================================================================
  1859                                  
  1860                                  ;-----------------------------------------------------------------------------
  1861                                  ; Effect jump tables
  1862                                  ;-----------------------------------------------------------------------------
  1863                                  
  1864 00000D22 90<rept>                align 4
  1865                                  
  1866                                  efxtable:
  1867 00000D24 [FD090000]              	dd      efxarpeggio	; 0 - arpeggio
  1868 00000D28 [2D070000]              	dd      efxnull		; 1 - porta up
  1869 00000D2C [2D070000]              	dd      efxnull		; 2 - porta down
  1870 00000D30 [48090000]              	dd      efxtoneporta	; 3 - tone porta
  1871 00000D34 [57090000]              	dd      efxvibrato	; 4 - vibrato
  1872 00000D38 [2D070000]              	dd      efxnull		; 5 - tone+slide
  1873 00000D3C [2D070000]              	dd      efxnull		; 6 - vibrato+slide
  1874 00000D40 [740A0000]              	dd      efxtremolo	; 7 - tremolo
  1875 00000D44 [2D070000]              	dd      efxnull		; 8 - unused
  1876 00000D48 [7F090000]              	dd      efxsampoffset	; 9 - sample offset
  1877 00000D4C [2D070000]              	dd      efxnull		; A - volume slide
  1878 00000D50 [8B090000]              	dd      efxpattjump	; B - pattern jump
  1879 00000D54 [99090000]              	dd      efxsetvolume	; C - set volume
  1880 00000D58 [A7090000]              	dd      efxbreak	; D - break pattern
  1881 00000D5C [2D070000]              	dd      efxnull		; E - extra effects
  1882 00000D60 [C6090000]              	dd      efxsetspeed	; F - set speed
  1883                                  
  1884                                  efxtable2:
  1885 00000D64 [2E070000]              	dd      efxarpeggio2	; 0 - arpeggio
  1886 00000D68 [50070000]              	dd      efxportaup	; 1 - porta up
  1887 00000D6C [75070000]              	dd      efxportadown	; 2 - porta down
  1888 00000D70 [9B070000]              	dd      efxtoneporta2	; 3 - tone porta
  1889 00000D74 [D3070000]              	dd      efxvibrato2	; 4 - vibrato
  1890 00000D78 [2F080000]              	dd      efxtoneslide	; 5 - tone+slide
  1891 00000D7C [3C080000]              	dd      efxvibslide	; 6 - vibrato+slide
  1892 00000D80 [63080000]              	dd      efxtremolo2	; 7 - tremolo
  1893 00000D84 [2D070000]              	dd      efxnull		; 8 - unused
  1894 00000D88 [2D070000]              	dd      efxnull		; 9 - sample offset
  1895 00000D8C [46080000]              	dd      efxvolslide	; A - volume slide
  1896 00000D90 [2D070000]              	dd      efxnull		; B - pattern jump
  1897 00000D94 [2D070000]              	dd      efxnull		; C - set volume
  1898 00000D98 [2D070000]              	dd      efxnull		; D - break pattern
  1899 00000D9C [2D070000]              	dd      efxnull		; E - extra effects
  1900 00000DA0 [2D070000]              	dd      efxnull		; F - set speed
  1901                                  
  1902                                  ;-----------------------------------------------------------------------------
  1903                                  ; Amiga period table
  1904                                  ;-----------------------------------------------------------------------------
  1905                                  
  1906                                  ;PeriodTable0:	
  1907                                  ;	dw	0
  1908                                  PeriodTable:
  1909 00000DA4 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1909 00000DAD 0A000A7009E8086808-
  1909 00000DB6 F00780071407       
  1910 00000DBC B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1910 00000DC5 050005B80474043404-
  1910 00000DCE F803C0038A03       
  1911 00000DD4 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1911 00000DDD 0280025C023A021A02-
  1911 00000DE6 FC01E001C501       
  1912 00000DEC AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1912 00000DF5 0140012E011D010D01-
  1912 00000DFE FE00F000E200       
  1913 00000E04 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1913 00000E0D 00A00097008F008700-
  1913 00000E16 7F0078007100       
  1914 00000E1C 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1914 00000E25 0050004B0047004300-
  1914 00000E2E 3F003C003800       
  1915 00000E34 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1915 00000E3D 002800250023002100-
  1915 00000E46 1F001E001C00       
  1916                                  
  1917                                  ;-----------------------------------------------------------------------------
  1918                                  ; Sinus wave table
  1919                                  ;-----------------------------------------------------------------------------
  1920                                  
  1921                                  SinTable:
  1922 00000E4C 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1922 00000E55 C5D4E1             
  1923 00000E58 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1923 00000E61 E1                 
  1924 00000E62 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1924 00000E6B 19                 
  1925                                  
  1926                                  ;=============================================================================
  1927                                  ; Copyright Strings & Messages
  1928                                  ;=============================================================================
  1929 00000E6C 0000                    		dw	0
  1930                                  msg_usage:
  1931 00000E6E 54696E79204D4F4420-     		db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1931 00000E77 506C6179657220666F-
  1931 00000E80 72205452444F532033-
  1931 00000E89 383620627920457264-
  1931 00000E92 6F67616E2054616E2E-
  1931 00000E9B 20                 
  1932 00000E9C 4F63746F6265722032-     		db	'October 2017.',10,13
  1932 00000EA5 3031372E0A0D       
  1933 00000EAB 75736167653A207469-     		db	'usage: tinyplay filename.mod', 10, 13,0
  1933 00000EB4 6E79706C6179206669-
  1933 00000EBD 6C656E616D652E6D6F-
  1933 00000EC6 640A0D00           
  1934 00000ECA 30312F31302F323031-     		db	'01/10/2017',0
  1934 00000ED3 3700               
  1935                                  
  1936                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1937                                  
  1938 00000ED5 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1938 00000EDE 506C61796572207630-
  1938 00000EE7 2E3162206279204361-
  1938 00000EF0 726C6F732048617361-
  1938 00000EF9 6E2E204A756C792031-
  1938 00000F02 3939332E           
  1939 00000F06 0A0D00                  		db	10,13,0
  1940 00000F09 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1940 00000F12 64696E67204D6F6475-
  1940 00000F1B 6C652066696C652E0A-
  1940 00000F24 0D00               
  1941 00000F26 536F756E6420426C61-     MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1941 00000F2F 73746572206E6F7420-
  1941 00000F38 666F756E64206F7220-
  1941 00000F41 495251206572726F72-
  1941 00000F4A 2E0A0D00           
  1942 00000F4E 536F756E6420426C61-     MsgFound:	db	'Sound Blaster found at Address 2'
  1942 00000F57 7374657220666F756E-
  1942 00000F60 642061742041646472-
  1942 00000F69 6573732032         
  1943 00000F6E 7830682C2049525120      PortText:	db	'x0h, IRQ '
  1944 00000F77 782E0A0D00              IrqText:	db	'x.',10,13,0
  1945                                  
  1946                                  trdos386_err_msg:
  1947 00000F7C 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1947 00000F85 2053797374656D2063-
  1947 00000F8E 616C6C206572726F72-
  1947 00000F97 20210A0D00         
  1948                                  
  1949                                  bss_start:
  1950                                  
  1951                                  ABSOLUTE bss_start
  1952                                  
  1953                                  alignb 2
  1954                                  
  1955                                  ;=============================================================================
  1956                                  ;        	uninitialized data
  1957                                  ;=============================================================================
  1958                                  
  1959                                  ; SB.ASM
  1960 00000F9C <res 00000001>          DmaFlag		resb	1		
  1961                                  
  1962                                  ; 11/03/2017
  1963 00000F9D <res 00000001>          iStatus:	resb	1
  1964                                    
  1965                                  ; MODLOAD.ASM
  1966 00000F9E <res 00000004>          FileHandle:	resd	1
  1967 00000FA2 <res 00000002>          ErrorInfo:	resw	1
  1968 00000FA4 <res 0000043C>          Header:		resb	ModHeader.size
  1969                                  
  1970                                  ; MODPLAY.ASM
  1971                                  sampling_rate:	; 11/03/2017
  1972 000013E0 <res 00000002>          MixSpeed:	resw 1
  1973                                  
  1974                                  ModInfo:
  1975 000013E2 <res 00000001>          ModInfo.OrderLen:   resb 1
  1976 000013E3 <res 00000001>          ModInfo.ReStart:    resb 1
  1977 000013E4 <res 00000080>          ModInfo.Order:	    resb 128
  1978 00001464 <res 00000004>          ModInfo.Patterns:   resd 1
  1979                                  
  1980 00001468 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1981 000014A6 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1982 000014E4 <res 0000003E>          ModInfo.SampLen:    resw 31
  1983 00001522 <res 0000003E>          ModInfo.SampRep:    resw 31
  1984 00001560 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1985 0000159E <res 0000003E>          ModInfo.SampVol:    resw 31
  1986                                  
  1987                                  ; MODPLAY.ASM
  1988                                  PitchTable:	;resw 857
  1989 000015DC <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  1990 0000309E <res 00004100>          VolTable:	resb 16640
  1991 0000719E <res 00001000>          MixBuffer       resb MixBufSize
  1992                                  
  1993                                  ; MODPLAY.ASM
  1994 0000819E <res 00000001>          OrderPos:	resb 1
  1995 0000819F <res 00000001>          Tempo:		resb 1
  1996 000081A0 <res 00000001>          TempoWait:	resb 1
  1997 000081A1 <res 00000001>          Bpm:		resb 1
  1998 000081A2 <res 00000001>          Row:		resb 1
  1999 000081A3 <res 00000001>          BreakRow:	resb 1
  2000 000081A4 <res 00000002>          BpmSamples:	resw 1
  2001 000081A6 <res 00000004>          BufPtr:		resd 1
  2002 000081AA <res 00000002>          BufLen:		resw 1
  2003 000081AC <res 00000004>          BufRep:		resd 1
  2004 000081B0 <res 00000004>          Note:		resd 1
  2005 000081B4 <res 00000098>          Tracks:		resb TrackInfo.size*NumTracks
  2006                                  
  2007 0000824C <res 00000004>          alignb 16
  2008                                  
  2009                                  ; PLAY.ASM
  2010 00008250 <res 00000280>          Scope:		resw	320
  2011 000084D0 <res 00000200>          RowOfs:		resw	256
  2012                                  
  2013                                  ;03/03/2017
  2014 000086D0 <res 00000004>          DMA_phy_buff:	resd 1
  2015                                  mod_file_name:
  2016 000086D4 <res 00000010>          		resb 16
  2017                                  
  2018                                  ; 12/03/2017
  2019 000086E4 <res 0000791C>          alignb 65536
  2020                                  
  2021                                  DmaBuffer:
  2022 00010000 <res 00010000>          DoubleBuffer:	resb 65536 ; DmaBufSize
  2023                                  
  2024                                  alignb 65536
  2025                                  
  2026                                  file_buffer:
  2027 00020000 <res 00060000>          		resb 65536*6 ; 13/03/2017
  2028                                  EOF:
