     1                                  ; ****************************************************************************
     2                                  ; twavplay.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TWAVPLAY.PRG ! VIA VT8237R WAV PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 23/08/2020
     7                                  ;
     8                                  ; [ Last Modification: 24/08/2020 ] 
     9                                  ;
    10                                  ; Derived from 'tmodply3.s' and 'wavplay2.s' source code by Erdogan Tan
    11                                  ; 
    12                                  ; Assembler: NASM 2.14
    13                                  ; ----------------------------------------------------------------------------
    14                                  ;	   nasm  twavplay.s -l twavplay.txt -o TWAVPLAY.PRG	
    15                                  ; ****************************************************************************
    16                                  
    17                                  ; 01/03/2017
    18                                  ; 16/10/2016
    19                                  ; 29/04/2016
    20                                  ; TRDOS 386 system calls (temporary list!)
    21                                  _ver 	equ 0
    22                                  _exit 	equ 1
    23                                  _fork 	equ 2
    24                                  _read 	equ 3
    25                                  _write	equ 4
    26                                  _open	equ 5
    27                                  _close 	equ 6
    28                                  _wait 	equ 7
    29                                  _creat 	equ 8
    30                                  _link 	equ 9
    31                                  _unlink	equ 10
    32                                  _exec	equ 11
    33                                  _chdir	equ 12
    34                                  _time 	equ 13
    35                                  _mkdir 	equ 14
    36                                  _chmod	equ 15
    37                                  _chown	equ 16
    38                                  _break	equ 17
    39                                  _stat	equ 18
    40                                  _seek	equ 19
    41                                  _tell 	equ 20
    42                                  _mount	equ 21
    43                                  _umount	equ 22
    44                                  _setuid	equ 23
    45                                  _getuid	equ 24
    46                                  _stime	equ 25
    47                                  _quit	equ 26	
    48                                  _intr	equ 27
    49                                  _fstat	equ 28
    50                                  _emt 	equ 29
    51                                  _mdate 	equ 30
    52                                  _video 	equ 31
    53                                  _audio	equ 32
    54                                  _timer	equ 33
    55                                  _sleep	equ 34
    56                                  _msg    equ 35
    57                                  _geterr	equ 36
    58                                  _fpsave	equ 37
    59                                  _pri	equ 38
    60                                  _rele	equ 39
    61                                  _fff	equ 40
    62                                  _fnf	equ 41
    63                                  _alloc	equ 42
    64                                  _dalloc equ 43
    65                                  _calbac equ 44		
    66                                  
    67                                  %macro sys 1-4
    68                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    69                                      ; 03/09/2015	
    70                                      ; 13/04/2015
    71                                      ; Retro UNIX 386 v1 system call.	
    72                                      %if %0 >= 2   
    73                                          mov ebx, %2
    74                                          %if %0 >= 3    
    75                                              mov ecx, %3
    76                                              %if %0 = 4
    77                                                 mov edx, %4   
    78                                              %endif
    79                                          %endif
    80                                      %endif
    81                                      mov eax, %1
    82                                      ;int 30h
    83                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    84                                  %endmacro
    85                                  
    86                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    87                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    88                                  
    89                                  ; 19/06/2017
    90                                  BUFFERSIZE equ 32768
    91                                  ; 23/08/2020
    92                                  ENDOFFILE equ 1	; flag for knowing end of file
    93                                  
    94                                  ; ----------------------------------------------------------------------------
    95                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
    96                                  ;	July 14th, 1993.
    97                                  
    98                                  ;=============================================================================
    99                                  ;  
   100                                  ;=============================================================================
   101                                  
   102                                  [BITS 32]
   103                                  [org 0]
   104                                  
   105                                  Start:
   106                                  	; clear bss
   107 00000000 B9[00000800]            	mov	ecx, EOF
   108 00000005 BF[D54A0000]            	mov	edi, bss_start
   109 0000000A 29F9                    	sub	ecx, edi
   110 0000000C D1E9                    	shr	ecx, 1
   111 0000000E 31C0                    	xor	eax, eax
   112 00000010 F366AB                  	rep	stosw
   113                                  
   114                                  	; Detect (& Enable) VT8233 Audio Device
   115 00000013 E824020000              	call    DetectVT8233
   116 00000018 731B                    	jnc     short GetFileName
   117                                  
   118                                  _dev_not_ready:
   119                                  ; couldn't find the audio device!
   120                                  	sys	_msg, noDevMsg, 255, 0Fh
   120                              <1> 
   120                              <1> 
   120                              <1> 
   120                              <1> 
   120                              <1>  %if %0 >= 2
   120 0000001A BB[76490000]        <1>  mov ebx, %2
   120                              <1>  %if %0 >= 3
   120 0000001F B9FF000000          <1>  mov ecx, %3
   120                              <1>  %if %0 = 4
   120 00000024 BA0F000000          <1>  mov edx, %4
   120                              <1>  %endif
   120                              <1>  %endif
   120                              <1>  %endif
   120 00000029 B823000000          <1>  mov eax, %1
   120                              <1> 
   120 0000002E CD40                <1>  int 40h
   121 00000030 E9E1010000                      jmp     Exit
   122                                  
   123                                  GetFileName:
   124 00000035 89E6                    	mov	esi, esp
   125 00000037 AD                      	lodsd
   126 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   127                                  		; (program file name & mod file name)
   128 0000003B 0F82E3010000            	jb	pmsg_usage ; nothing to do
   129                                  
   130 00000041 AD                      	lodsd ; program file name address 
   131 00000042 AD                      	lodsd ; wav file name address (file to be read)
   132 00000043 89C6                    	mov	esi, eax
   133 00000045 BF[084B0000]            	mov	edi, wav_file_name
   134                                  ScanName:       
   135 0000004A AC                      	lodsb
   136 0000004B 84C0                    	test	al, al
   137 0000004D 0F84D1010000            	je	pmsg_usage
   138 00000053 3C20                    	cmp	al, 20h
   139 00000055 74F3                    	je	short ScanName	; scan start of name.
   140 00000057 AA                      	stosb
   141 00000058 B4FF                    	mov	ah, 0FFh
   142                                  a_0:	
   143 0000005A FEC4                    	inc	ah
   144                                  a_1:
   145 0000005C AC                      	lodsb
   146 0000005D AA                      	stosb
   147 0000005E 3C2E                    	cmp	al, '.'
   148 00000060 74F8                    	je	short a_0	
   149 00000062 20C0                    	and	al, al
   150 00000064 75F6                    	jnz	short a_1
   151                                  
   152 00000066 08E4                    	or	ah, ah		 ; if period NOT found,
   153 00000068 750B                    	jnz	short PrintPMesg ; then add a .MOD extension.
   154                                  SetExt:
   155 0000006A 4F                      	dec	edi
   156 0000006B C7072E574156            	mov	dword [edi], '.WAV'
   157 00000071 C6470400                	mov	byte [edi+4], 0
   158                                  PrintPMesg: 
   159                                  	; 23/08/2020
   160 00000075 C605[48490000]00        	mov	byte [credits_zero], 0
   161                                       
   162                                  	; Prints the Credits Text.
   163                                  	sys	_msg, Credits, 255, 0Fh
   163                              <1> 
   163                              <1> 
   163                              <1> 
   163                              <1> 
   163                              <1>  %if %0 >= 2
   163 0000007C BB[EA480000]        <1>  mov ebx, %2
   163                              <1>  %if %0 >= 3
   163 00000081 B9FF000000          <1>  mov ecx, %3
   163                              <1>  %if %0 = 4
   163 00000086 BA0F000000          <1>  mov edx, %4
   163                              <1>  %endif
   163                              <1>  %endif
   163                              <1>  %endif
   163 0000008B B823000000          <1>  mov eax, %1
   163                              <1> 
   163 00000090 CD40                <1>  int 40h
   164                                  _1:
   165                                  	; 19/06/2017
   166                                  	; Allocate Audio Buffer (for user)
   167                                  	sys	_audio, 0200h, BUFFERSIZE, audio_buffer
   167                              <1> 
   167                              <1> 
   167                              <1> 
   167                              <1> 
   167                              <1>  %if %0 >= 2
   167 00000092 BB00020000          <1>  mov ebx, %2
   167                              <1>  %if %0 >= 3
   167 00000097 B900800000          <1>  mov ecx, %3
   167                              <1>  %if %0 = 4
   167 0000009C BA[00600000]        <1>  mov edx, %4
   167                              <1>  %endif
   167                              <1>  %endif
   167                              <1>  %endif
   167 000000A1 B820000000          <1>  mov eax, %1
   167                              <1> 
   167 000000A6 CD40                <1>  int 40h
   168 000000A8 0F82B8000000            	jc	error_exit
   169                                  _2:
   170                                  	; 23/08/2020
   171                                  	; Initialize Audio Device (bl = 1 -> Interrupt method)
   172                                  	;sys	_audio, 0301h, 0, audio_int_handler 
   173                                  	;jc	error_exit
   174                                  	
   175                                  	; 24/08/2020
   176                                  
   177                                  	; 20/10/2017
   178                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   179                                  	sys	_audio, 0300h, 1, srb
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1>  %if %0 >= 2
   179 000000AE BB00030000          <1>  mov ebx, %2
   179                              <1>  %if %0 >= 3
   179 000000B3 B901000000          <1>  mov ecx, %3
   179                              <1>  %if %0 = 4
   179 000000B8 BA[634B0000]        <1>  mov edx, %4
   179                              <1>  %endif
   179                              <1>  %endif
   179                              <1>  %endif
   179 000000BD B820000000          <1>  mov eax, %1
   179                              <1> 
   179 000000C2 CD40                <1>  int 40h
   180 000000C4 0F829C000000            	jc	error_exit
   181                                  
   182                                  	; 23/08/2020
   183                                  
   184                                  ; open the wav file
   185                                          ; open existing file
   186 000000CA E87A010000                      call    openFile ; no error? ok.
   187 000000CF 731B                            jnc     short _3
   188                                  
   189                                  ; file not found!
   190                                  	sys	_msg, noFileErrMsg, 255, 0Fh
   190                              <1> 
   190                              <1> 
   190                              <1> 
   190                              <1> 
   190                              <1>  %if %0 >= 2
   190 000000D1 BB[AD490000]        <1>  mov ebx, %2
   190                              <1>  %if %0 >= 3
   190 000000D6 B9FF000000          <1>  mov ecx, %3
   190                              <1>  %if %0 = 4
   190 000000DB BA0F000000          <1>  mov edx, %4
   190                              <1>  %endif
   190                              <1>  %endif
   190                              <1>  %endif
   190 000000E0 B823000000          <1>  mov eax, %1
   190                              <1> 
   190 000000E5 CD40                <1>  int 40h
   191 000000E7 E92A010000                      jmp	Exit
   192                                  
   193                                  _3:
   194 000000EC E892010000                     	call    getSampleRate	; read the sample rate
   195                                                               	; pass it onto codec.
   196 000000F1 0F821F010000            	jc	Exit
   197                                  
   198 000000F7 66A3[EA4A0000]          	mov	[sample_rate], ax
   199 000000FD 880D[E84A0000]          	mov	[stmo], cl
   200 00000103 8815[E94A0000]          	mov	[bps], dl
   201                                  
   202                                  	; 10/06/2017
   203                                  	sys	_audio, 0E00h ; get audio controller info
   203                              <1> 
   203                              <1> 
   203                              <1> 
   203                              <1> 
   203                              <1>  %if %0 >= 2
   203 00000109 BB000E0000          <1>  mov ebx, %2
   203                              <1>  %if %0 >= 3
   203                              <1>  mov ecx, %3
   203                              <1>  %if %0 = 4
   203                              <1>  mov edx, %4
   203                              <1>  %endif
   203                              <1>  %endif
   203                              <1>  %endif
   203 0000010E B820000000          <1>  mov eax, %1
   203                              <1> 
   203 00000113 CD40                <1>  int 40h
   204 00000115 724F                    	jc	error_exit
   205                                  
   206                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   207                                  	;jne	_dev_not_ready		
   208                                  
   209                                  	; EAX = IRQ Number in AL
   210                                  	;	Audio Device Number in AH 
   211                                  	; EBX = DEV/VENDOR ID
   212                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   213                                  	; ECX = BUS/DEV/FN 
   214                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   215                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   216                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   217                                  	;      (Low word, DX = NAMBAR address)
   218                                  
   219 00000117 A2[624B0000]            	mov	[ac97_int_ln_reg], al
   220 0000011C 891D[584B0000]          	mov	[dev_vendor], ebx
   221 00000122 890D[5C4B0000]          	mov	[bus_dev_fn], ecx
   222 00000128 668915[604B0000]        	mov	[ac97_io_base], dx	
   223                                    
   224 0000012F E847030000              	call	write_audio_dev_info
   225                                  
   226                                  	; 24/08/2020
   227 00000134 E8C3040000              	call	write_wav_file_info 
   228                                  
   229                                  	; 23/08/2020
   230                                  PlayNow: 
   231                                  	; 27/10/2017
   232 00000139 66B90001                	mov	cx, 256
   233 0000013D 31DB                    	xor	ebx, ebx
   234 0000013F BF[704B0000]            	mov	edi, RowOfs
   235                                  MakeOfs:
   236                                  	; 29/10/2017
   237                                  	;mov	ax, 128
   238                                  	;mul	bx
   239                                  	;mov	al, ah
   240                                  	;mov	ah, 80
   241                                  	;mul	ah
   242 00000144 89D8                    	mov	eax, ebx
   243 00000146 66C1E007                	shl	ax, 7 ; * 128
   244 0000014A B050                    	mov	al, 80
   245 0000014C F6E4                    	mul	ah
   246 0000014E 66AB                    	stosw
   247 00000150 43                      	inc	ebx
   248 00000151 E2F1                    	loop	MakeOfs
   249                                  
   250                                  	; 23/08/2020
   251                                  
   252                                  	; DIRECT VGA MEMORY ACCESS
   253                                  	; bl = 0, bh = 5
   254                                  	; Direct access/map to VGA memory (0A0000h)
   255                                  
   256                                  	sys	_video, 0500h
   256                              <1> 
   256                              <1> 
   256                              <1> 
   256                              <1> 
   256                              <1>  %if %0 >= 2
   256 00000153 BB00050000          <1>  mov ebx, %2
   256                              <1>  %if %0 >= 3
   256                              <1>  mov ecx, %3
   256                              <1>  %if %0 = 4
   256                              <1>  mov edx, %4
   256                              <1>  %endif
   256                              <1>  %endif
   256                              <1>  %endif
   256 00000158 B81F000000          <1>  mov eax, %1
   256                              <1> 
   256 0000015D CD40                <1>  int 40h
   257 0000015F 3D00000A00              	cmp	eax, 0A0000h
   258 00000164 741B                    	je	short _4
   259                                  error_exit:
   260                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   260                              <1> 
   260                              <1> 
   260                              <1> 
   260                              <1> 
   260                              <1>  %if %0 >= 2
   260 00000166 BB[C6490000]        <1>  mov ebx, %2
   260                              <1>  %if %0 >= 3
   260 0000016B B9FF000000          <1>  mov ecx, %3
   260                              <1>  %if %0 = 4
   260 00000170 BA0E000000          <1>  mov edx, %4
   260                              <1>  %endif
   260                              <1>  %endif
   260                              <1>  %endif
   260 00000175 B823000000          <1>  mov eax, %1
   260                              <1> 
   260 0000017A CD40                <1>  int 40h
   261 0000017C E995000000              	jmp	Exit
   262                                  
   263                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   264                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   265                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   266                                  ;       second, or the module will sound "looped".
   267                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   268                                  ;       the polling is called from my routine, and then the irq 0 must be
   269                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   270                                  ;       samples played by the Sound Blaster. Note that some samples are
   271                                  ;       discarded in the next code, just for fun!
   272                                  
   273                                  _4:
   274                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   275                                  	;int     31h
   276                                  
   277                                  	; 21/10/2017
   278                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   279                                  	;int	31h
   280                                  
   281                                  	; 22/10/2017
   282 00000181 E841050000              	call	setgraphmode	; Set video mode to 640*480x16
   283                                  
   284                                  	; 22/10/2017
   285                                  	;call	loadlbm
   286                                  	;jc	short loadlbm_err
   287                                  
   288 00000186 BE[F4080000]            	mov	esi, LOGO_ADDRESS
   289 0000018B E829060000              	call	putlbm
   290                                  	;jnc	short loadlbm_ok
   291 00000190 731D                    	jnc	short _5 ; 
   292                                  
   293                                  	;mov	byte [error_color], 0Eh ; Yellow
   294                                  
   295                                  loadlbm_err:
   296                                  	; 21/10/2017
   297                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   298                                  	;int	31h
   299                                  	; 22/10/2017
   300 00000192 E84D050000              	call	settextmode
   301                                  
   302                                  	sys	_msg, LOGO_ERROR_MSG, 255, 0Ch
   302                              <1> 
   302                              <1> 
   302                              <1> 
   302                              <1> 
   302                              <1>  %if %0 >= 2
   302 00000197 BB[C7080000]        <1>  mov ebx, %2
   302                              <1>  %if %0 >= 3
   302 0000019C B9FF000000          <1>  mov ecx, %3
   302                              <1>  %if %0 = 4
   302 000001A1 BA0C000000          <1>  mov edx, %4
   302                              <1>  %endif
   302                              <1>  %endif
   302                              <1>  %endif
   302 000001A6 B823000000          <1>  mov eax, %1
   302                              <1> 
   302 000001AB CD40                <1>  int 40h
   303 000001AD EB67                    	jmp	short Exit
   304                                  
   305                                  loadlbm_ok: 
   306                                  	; 21/10/2017
   307                                  _5:
   308                                  	; 09/10/2017 (2*BUFFERSIZE, 64K)
   309                                  	; 23/06/2017
   310                                  	; Map DMA buffer to user's memory space
   311                                  	sys	_audio, 0D00h, 2*BUFFERSIZE, DMA_Buffer
   311                              <1> 
   311                              <1> 
   311                              <1> 
   311                              <1> 
   311                              <1>  %if %0 >= 2
   311 000001AF BB000D0000          <1>  mov ebx, %2
   311                              <1>  %if %0 >= 3
   311 000001B4 B900000100          <1>  mov ecx, %3
   311                              <1>  %if %0 = 4
   311 000001B9 BA[00000100]        <1>  mov edx, %4
   311                              <1>  %endif
   311                              <1>  %endif
   311                              <1>  %endif
   311 000001BE B820000000          <1>  mov eax, %1
   311                              <1> 
   311 000001C3 CD40                <1>  int 40h
   312                                  	;jc	error_exit
   313                                  
   314                                  	; 23/08/2020
   315                                  
   316                                  ; position file pointer to start in actual wav data
   317                                  ; MUCH improvement should really be done here to check if sample size is
   318                                  ; supported, make sure there are 2 channels, etc.  
   319                                  ;
   320                                          ;mov     ah, 42h
   321                                          ;mov     al, 0	; from start of file
   322                                          ;mov     bx, [FileHandle]
   323                                          ;xor     cx, cx
   324                                          ;mov     dx, 44	; jump past .wav/riff header
   325                                          ;int     21h
   326                                  
   327                                  	sys	_seek, [FileHandle], 44, 0
   327                              <1> 
   327                              <1> 
   327                              <1> 
   327                              <1> 
   327                              <1>  %if %0 >= 2
   327 000001C5 8B1D[E5480000]      <1>  mov ebx, %2
   327                              <1>  %if %0 >= 3
   327 000001CB B92C000000          <1>  mov ecx, %3
   327                              <1>  %if %0 = 4
   327 000001D0 BA00000000          <1>  mov edx, %4
   327                              <1>  %endif
   327                              <1>  %endif
   327                              <1>  %endif
   327 000001D5 B813000000          <1>  mov eax, %1
   327                              <1> 
   327 000001DA CD40                <1>  int 40h
   328                                  
   329                                  ; play the .wav file. Most of the good stuff is in here.
   330                                  
   331 000001DC E851010000                      call    PlayWav
   332                                  
   333                                  ; close the .wav file and exit.
   334                                  
   335                                  StopPlaying:
   336                                  	; Stop Playing
   337                                  	sys	_audio, 0700h
   337                              <1> 
   337                              <1> 
   337                              <1> 
   337                              <1> 
   337                              <1>  %if %0 >= 2
   337 000001E1 BB00070000          <1>  mov ebx, %2
   337                              <1>  %if %0 >= 3
   337                              <1>  mov ecx, %3
   337                              <1>  %if %0 = 4
   337                              <1>  mov edx, %4
   337                              <1>  %endif
   337                              <1>  %endif
   337                              <1>  %endif
   337 000001E6 B820000000          <1>  mov eax, %1
   337                              <1> 
   337 000001EB CD40                <1>  int 40h
   338                                  	; Cancel callback service (for user)
   339                                  	sys	_audio, 0900h
   339                              <1> 
   339                              <1> 
   339                              <1> 
   339                              <1> 
   339                              <1>  %if %0 >= 2
   339 000001ED BB00090000          <1>  mov ebx, %2
   339                              <1>  %if %0 >= 3
   339                              <1>  mov ecx, %3
   339                              <1>  %if %0 = 4
   339                              <1>  mov edx, %4
   339                              <1>  %endif
   339                              <1>  %endif
   339                              <1>  %endif
   339 000001F2 B820000000          <1>  mov eax, %1
   339                              <1> 
   339 000001F7 CD40                <1>  int 40h
   340                                  	; Deallocate Audio Buffer (for user)
   341                                  	sys	_audio, 0A00h
   341                              <1> 
   341                              <1> 
   341                              <1> 
   341                              <1> 
   341                              <1>  %if %0 >= 2
   341 000001F9 BB000A0000          <1>  mov ebx, %2
   341                              <1>  %if %0 >= 3
   341                              <1>  mov ecx, %3
   341                              <1>  %if %0 = 4
   341                              <1>  mov edx, %4
   341                              <1>  %endif
   341                              <1>  %endif
   341                              <1>  %endif
   341 000001FE B820000000          <1>  mov eax, %1
   341                              <1> 
   341 00000203 CD40                <1>  int 40h
   342                                  	; Disable Audio Device
   343                                  	sys	_audio, 0C00h
   343                              <1> 
   343                              <1> 
   343                              <1> 
   343                              <1> 
   343                              <1>  %if %0 >= 2
   343 00000205 BB000C0000          <1>  mov ebx, %2
   343                              <1>  %if %0 >= 3
   343                              <1>  mov ecx, %3
   343                              <1>  %if %0 = 4
   343                              <1>  mov edx, %4
   343                              <1>  %endif
   343                              <1>  %endif
   343                              <1>  %endif
   343 0000020A B820000000          <1>  mov eax, %1
   343                              <1> 
   343 0000020F CD40                <1>  int 40h
   344                                  
   345                                  	; 23/08/2020
   346 00000211 E8CE040000              	call	settextmode
   347                                  Exit:  
   348 00000216 E847000000                      call    closeFile
   349                                           
   350                                  	sys	_exit	; Bye!
   350                              <1> 
   350                              <1> 
   350                              <1> 
   350                              <1> 
   350                              <1>  %if %0 >= 2
   350                              <1>  mov ebx, %2
   350                              <1>  %if %0 >= 3
   350                              <1>  mov ecx, %3
   350                              <1>  %if %0 = 4
   350                              <1>  mov edx, %4
   350                              <1>  %endif
   350                              <1>  %endif
   350                              <1>  %endif
   350 0000021B B801000000          <1>  mov eax, %1
   350                              <1> 
   350 00000220 CD40                <1>  int 40h
   351                                  here:
   352 00000222 EBFE                    	jmp	short here
   353                                  
   354                                  pmsg_usage:
   355                                  	sys	_msg, msg_usage, 255, 0Bh
   355                              <1> 
   355                              <1> 
   355                              <1> 
   355                              <1> 
   355                              <1>  %if %0 >= 2
   355 00000224 BB[EA480000]        <1>  mov ebx, %2
   355                              <1>  %if %0 >= 3
   355 00000229 B9FF000000          <1>  mov ecx, %3
   355                              <1>  %if %0 = 4
   355 0000022E BA0B000000          <1>  mov edx, %4
   355                              <1>  %endif
   355                              <1>  %endif
   355                              <1>  %endif
   355 00000233 B823000000          <1>  mov eax, %1
   355                              <1> 
   355 00000238 CD40                <1>  int 40h
   356 0000023A EBDA                    	jmp	short Exit
   357                                  
   358                                  DetectVT8233:
   359                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   360                                          sys	_audio, 0103h
   360                              <1> 
   360                              <1> 
   360                              <1> 
   360                              <1> 
   360                              <1>  %if %0 >= 2
   360 0000023C BB03010000          <1>  mov ebx, %2
   360                              <1>  %if %0 >= 3
   360                              <1>  mov ecx, %3
   360                              <1>  %if %0 = 4
   360                              <1>  mov edx, %4
   360                              <1>  %endif
   360                              <1>  %endif
   360                              <1>  %endif
   360 00000241 B820000000          <1>  mov eax, %1
   360                              <1> 
   360 00000246 CD40                <1>  int 40h
   361 00000248 C3                      	retn
   362                                  
   363                                  	; 23/08/2020
   364                                  
   365                                  ;open or create file
   366                                  ;
   367                                  ;input: ds:dx-->filename (asciiz)
   368                                  ;       al=file Mode (create or open)
   369                                  ;output: none  cs:[FileHandle] filled
   370                                  ;
   371                                  openFile:
   372                                  	;mov	ah, 3Bh	; start with a mode
   373                                  	;add	ah, al	; add in create or open mode
   374                                  	;xor	cx, cx
   375                                  	;int	21h
   376                                  	;jc	short _of1
   377                                  	;;mov	[cs:FileHandle], ax
   378                                  
   379                                  	sys	_open, wav_file_name, 0
   379                              <1> 
   379                              <1> 
   379                              <1> 
   379                              <1> 
   379                              <1>  %if %0 >= 2
   379 00000249 BB[084B0000]        <1>  mov ebx, %2
   379                              <1>  %if %0 >= 3
   379 0000024E B900000000          <1>  mov ecx, %3
   379                              <1>  %if %0 = 4
   379                              <1>  mov edx, %4
   379                              <1>  %endif
   379                              <1>  %endif
   379                              <1>  %endif
   379 00000253 B805000000          <1>  mov eax, %1
   379                              <1> 
   379 00000258 CD40                <1>  int 40h
   380 0000025A 7205                    	jc	short _of1
   381                                  
   382 0000025C A3[E5480000]            	mov	[FileHandle], eax
   383                                  _of1:
   384 00000261 C3                      	retn
   385                                  
   386                                  ; close the currently open file
   387                                  ; input: none, uses cs:[FileHandle]
   388                                  closeFile:
   389 00000262 833D[E5480000]FF        	cmp	dword [FileHandle], -1
   390 00000269 7417                    	je	short _cf1
   391                                  	;mov    bx, [FileHandle]  
   392                                  	;mov    ax, 3E00h
   393                                          ;int    21h              ;close file
   394                                  
   395                                  	sys	_close, [FileHandle]
   395                              <1> 
   395                              <1> 
   395                              <1> 
   395                              <1> 
   395                              <1>  %if %0 >= 2
   395 0000026B 8B1D[E5480000]      <1>  mov ebx, %2
   395                              <1>  %if %0 >= 3
   395                              <1>  mov ecx, %3
   395                              <1>  %if %0 = 4
   395                              <1>  mov edx, %4
   395                              <1>  %endif
   395                              <1>  %endif
   395                              <1>  %endif
   395 00000271 B806000000          <1>  mov eax, %1
   395                              <1> 
   395 00000276 CD40                <1>  int 40h
   396 00000278 C705[E5480000]FFFF-     	mov 	dword [FileHandle], -1
   396 00000280 FFFF               
   397                                  _cf1:
   398 00000282 C3                      	retn
   399                                  
   400                                  getSampleRate:
   401                                  	
   402                                  ; reads the sample rate from the .wav file.
   403                                  ; entry: none - assumes file is already open
   404                                  ; exit: ax = sample rate (11025, 22050, 44100, 48000)
   405                                  ;	cx = number of channels (mono=1, stereo=2)
   406                                  ;	dx = bits per sample (8, 16)
   407                                  
   408 00000283 53                      	push    ebx
   409                                  
   410                                          ;mov	ah, 42h
   411                                          ;mov	al, 0	; from start of file
   412                                          ;mov	bx, [FileHandle]
   413                                          ;xor	cx, cx
   414                                          ;mov	dx, 08h	; "WAVE"
   415                                          ;int	21h
   416                                  	
   417                                  	sys	_seek, [FileHandle], 8, 0
   417                              <1> 
   417                              <1> 
   417                              <1> 
   417                              <1> 
   417                              <1>  %if %0 >= 2
   417 00000284 8B1D[E5480000]      <1>  mov ebx, %2
   417                              <1>  %if %0 >= 3
   417 0000028A B908000000          <1>  mov ecx, %3
   417                              <1>  %if %0 = 4
   417 0000028F BA00000000          <1>  mov edx, %4
   417                              <1>  %endif
   417                              <1>  %endif
   417                              <1>  %endif
   417 00000294 B813000000          <1>  mov eax, %1
   417                              <1> 
   417 00000299 CD40                <1>  int 40h
   418                                  
   419                                          ;mov	dx, smpRBuff
   420                                          ;mov	cx, 28	; 28 bytes
   421                                  	;mov	ah, 3fh
   422                                          ;int	21h
   423                                  
   424                                  	sys	_read, [FileHandle], smpRBuff, 28
   424                              <1> 
   424                              <1> 
   424                              <1> 
   424                              <1> 
   424                              <1>  %if %0 >= 2
   424 0000029B 8B1D[E5480000]      <1>  mov ebx, %2
   424                              <1>  %if %0 >= 3
   424 000002A1 B9[EC4A0000]        <1>  mov ecx, %3
   424                              <1>  %if %0 = 4
   424 000002A6 BA1C000000          <1>  mov edx, %4
   424                              <1>  %endif
   424                              <1>  %endif
   424                              <1>  %endif
   424 000002AB B803000000          <1>  mov eax, %1
   424                              <1> 
   424 000002B0 CD40                <1>  int 40h
   425                                  
   426 000002B2 813D[EC4A0000]5741-     	cmp	dword [smpRBuff], 'WAVE'
   426 000002BA 5645               
   427 000002BC 7520                    	jne	short gsr_stc
   428                                  
   429 000002BE 66833D[F84A0000]01      	cmp	word [smpRBuff+12], 1	; Offset 20, must be 1 (= PCM)
   430 000002C6 7516                    	jne	short gsr_stc
   431                                  
   432 000002C8 668B0D[FA4A0000]        	mov	cx, [smpRBuff+14]	; return num of channels in CX
   433 000002CF 66A1[FC4A0000]                  mov     ax, [smpRBuff+16]	; return sample rate in AX
   434 000002D5 668B15[064B0000]        	mov	dx, [smpRBuff+26]	; return bits per sample value in DX
   435                                  gsr_retn:
   436 000002DC 5B                              pop     ebx
   437 000002DD C3                              retn
   438                                  gsr_stc:
   439 000002DE F9                      	stc
   440 000002DF EBFB                    	jmp	short gsr_retn
   441                                  
   442                                  ;=============================================================================
   443                                  
   444                                  ;	; 23/08/2020
   445                                  ;audio_int_handler:
   446                                  ;	; 14/10/2017
   447                                  ;	mov	byte [srb], 1
   448                                  ;
   449                                  ;	sys	_rele ; return from callback service 
   450                                  ;	; we must not come here !
   451                                  ;	sys	_exit
   452                                  
   453                                  ;=============================================================================
   454                                  
   455                                  	; 23/08/2020
   456                                  loadFromFile:
   457 000002E1 BF[00600000]            	mov     edi, audio_buffer
   458 000002E6 BA00800000              	mov	edx, BUFFERSIZE
   459                                  
   460                                  	; 17/03/2017
   461                                  	; edi = buffer address
   462                                  	; edx = buffer size
   463                                  	; 10/03/2017
   464                                          ;push	eax
   465                                          ;push	ecx
   466                                          ;push	edx
   467                                  	;push	ebx
   468 000002EB F605[644B0000]01                test    byte [flags], ENDOFFILE	; have we already read the
   469 000002F2 F9                              stc			; last of the file?
   470 000002F3 7531                            jnz     short endLFF
   471                                  	;clc
   472                                  	; load file into memory
   473                                  	sys 	_read, [FileHandle], edi
   473                              <1> 
   473                              <1> 
   473                              <1> 
   473                              <1> 
   473                              <1>  %if %0 >= 2
   473 000002F5 8B1D[E5480000]      <1>  mov ebx, %2
   473                              <1>  %if %0 >= 3
   473 000002FB 89F9                <1>  mov ecx, %3
   473                              <1>  %if %0 = 4
   473                              <1>  mov edx, %4
   473                              <1>  %endif
   473                              <1>  %endif
   473                              <1>  %endif
   473 000002FD B803000000          <1>  mov eax, %1
   473                              <1> 
   473 00000302 CD40                <1>  int 40h
   474 00000304 89D1                    	mov	ecx, edx
   475 00000306 720A                    	jc	short padfill ; error !
   476 00000308 21C0                    	and	eax, eax
   477 0000030A 7406                    	jz	short padfill
   478 0000030C 29C1                    	sub	ecx, eax
   479 0000030E 7416                    	jz	short endLFF
   480 00000310 01C7                    	add	edi, eax  
   481                                  padfill:
   482 00000312 803D[E94A0000]10        	cmp 	byte [bps], 16
   483 00000319 740C                    	je	short _lff2
   484                                  	; Minimum Value = 0
   485 0000031B 30C0                            xor     al, al
   486 0000031D F3AA                    	rep	stosb
   487                                  _lff1:
   488                                          ;clc			; don't exit with CY yet.
   489 0000031F 800D[644B0000]01                or	byte [flags], ENDOFFILE	; end of file flag
   490                                  endLFF:
   491                                  	;pop	ebx
   492                                  	;pop	edx
   493                                          ;pop	ecx
   494                                          ;pop	eax
   495 00000326 C3                              retn
   496                                  _lff2:
   497                                  	; Minimum value = 8000h (-32768)
   498 00000327 D1E9                    	shr	ecx, 1 
   499 00000329 66B80080                	mov	ax, 8000h ; -32768
   500 0000032D F366AB                  	rep	stosw
   501 00000330 EBED                    	jmp	short _lff1
   502                                  
   503                                  ;=============================================================================
   504                                  ;      
   505                                  ;=============================================================================
   506                                  
   507                                  PlayWav:
   508                                  	; 23/08/2020
   509                                  
   510                                         ; load 32768 bytes into audio buffer
   511                                  	;mov	edi, audio_buffer
   512                                  	;mov	edx, BUFFERSIZE
   513 00000332 E8AAFFFFFF              	call	loadFromFile
   514 00000337 0F8229FEFFFF            	jc	error_exit
   515                                  
   516                                  	; 27/07/2020
   517 0000033D F605[644B0000]01        	test    byte [flags], ENDOFFILE  ; end of file
   518 00000344 7511                    	jnz	short _6 ; yes
   519                                  			 ; bypass filling dma half buffer 2
   520                                  
   521                                  	; bh = 16 : update (current, first) dma half buffer
   522                                  	; bl = 0  : then switch to the next (second) half buffer
   523                                  	sys	_audio, 1000h
   523                              <1> 
   523                              <1> 
   523                              <1> 
   523                              <1> 
   523                              <1>  %if %0 >= 2
   523 00000346 BB00100000          <1>  mov ebx, %2
   523                              <1>  %if %0 >= 3
   523                              <1>  mov ecx, %3
   523                              <1>  %if %0 = 4
   523                              <1>  mov edx, %4
   523                              <1>  %endif
   523                              <1>  %endif
   523                              <1>  %endif
   523 0000034B B820000000          <1>  mov eax, %1
   523                              <1> 
   523 00000350 CD40                <1>  int 40h
   524                                  
   525                                  	; 27/07/2020
   526                                  	; [audio_flag] = 1  (in TRDOS 386 kernel)
   527                                  
   528                                  	; audio_buffer must be filled again after above system call 
   529                                  	; (Because audio interrupt will be generated by VT8237R
   530                                  	; at the end of the first half of dma buffer.. so, 
   531                                  	; the second half must be ready. 'sound_play' will use it.)
   532                                  
   533                                  	; 13/10/2017
   534                                  	;mov	edi, audio_buffer
   535                                  	;mov	edx, BUFFERSIZE
   536 00000352 E88AFFFFFF              	call    loadFromFile
   537                                  	;jc	short p_return ; 27/07/2020
   538                                  _6:
   539                                  	; Set Master Volume Level
   540                                  	sys	_audio, 0B00h, 1D1Dh
   540                              <1> 
   540                              <1> 
   540                              <1> 
   540                              <1> 
   540                              <1>  %if %0 >= 2
   540 00000357 BB000B0000          <1>  mov ebx, %2
   540                              <1>  %if %0 >= 3
   540 0000035C B91D1D0000          <1>  mov ecx, %3
   540                              <1>  %if %0 = 4
   540                              <1>  mov edx, %4
   540                              <1>  %endif
   540                              <1>  %endif
   540                              <1>  %endif
   540 00000361 B820000000          <1>  mov eax, %1
   540                              <1> 
   540 00000366 CD40                <1>  int 40h
   541                                  	; 24/06/2017
   542                                  	;mov	byte [volume_level], 1Dh
   543 00000368 880D[71550000]          	mov	[volume_level], cl	
   544                                  
   545                                  	;mov	byte [srb], 0
   546                                  
   547                                  	; Start	to play
   548 0000036E A0[E94A0000]            	mov	al, [bps]
   549 00000373 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   550 00000376 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   551 00000378 8A1D[E84A0000]          	mov	bl, [stmo]
   552 0000037E FECB                    	dec	bl
   553 00000380 08C3                    	or	bl, al
   554 00000382 668B0D[EA4A0000]        	mov	cx, [sample_rate] 
   555 00000389 B704                    	mov	bh, 4 ; start to play	
   556                                  	sys	_audio
   556                              <1> 
   556                              <1> 
   556                              <1> 
   556                              <1> 
   556                              <1>  %if %0 >= 2
   556                              <1>  mov ebx, %2
   556                              <1>  %if %0 >= 3
   556                              <1>  mov ecx, %3
   556                              <1>  %if %0 = 4
   556                              <1>  mov edx, %4
   556                              <1>  %endif
   556                              <1>  %endif
   556                              <1>  %endif
   556 0000038B B820000000          <1>  mov eax, %1
   556                              <1> 
   556 00000390 CD40                <1>  int 40h
   557                                  
   558                                  	; 27/07/2020
   559                                  	; Here..
   560                                  	; If byte [flags] <> ENDOFFILE ...
   561                                  	; user's audio_buffer has been copied to dma half buffer 2
   562                                  
   563                                  	; [audio_flag] = 0  (in TRDOS 386 kernel)
   564                                  
   565                                  	; audio_buffer must be filled again after above system call 
   566                                  	; (Because, audio interrupt will be generated by VT8237R
   567                                  	; at the end of the first half of dma buffer.. so, 
   568                                  	; the 2nd half of dma buffer is ready but the 1st half
   569                                  	; must be filled again.)
   570                                  
   571                                  	; 27/07/2020
   572 00000392 F605[644B0000]01        	test    byte [flags], ENDOFFILE  ; end of file
   573 00000399 750B                    	jnz	short p_loop ; yes
   574                                  
   575                                  	; 13/10/2017
   576                                  	;mov	edi, audio_buffer
   577                                  	;mov	edx, BUFFERSIZE
   578 0000039B E841FFFFFF              	call    loadFromFile
   579                                  	;jc	short p_return ; 27/07/2020
   580                                  
   581                                  	; we need to wait for 'SRB' (audio interrupt)
   582                                  	; (we can not return from 'PlayWav' here 
   583                                  	;  even if we have got an error from file reading)
   584                                  	; ((!!current audio data must be played!!))
   585                                  
   586                                  	;mov	ebx, 0B8000h ; video display page address
   587                                  	;mov	ah, 4Eh
   588                                  	;add	al, [half_buffer]
   589                                  	;mov	[ebx], ax ; show playing buffer (1, 2)
   590                                  
   591                                  	;; load 32768 bytes into audio buffer
   592                                  	;; (for the second half of DMA buffer)
   593                                  	;; 20/05/2017
   594                                  	;mov	edi, audio_buffer
   595                                  	;mov	edx, BUFFERSIZE
   596                                  	;call	loadFromFile
   597                                  	;jc	short p_return
   598                                  	;mov	byte [half_buff], 2 ; (DMA) Buffer 2
   599                                  
   600                                  	; 23/08/2020
   601                                  
   602                                  	; 27/10/2017
   603                                  	
   604                                  	; 03/08/2020
   605                                       	;jmp	short modp_gs ; 23/06/2017
   606                                  
   607                                  	; 24/08/2020
   608 000003A0 FE05[654B0000]          	inc	byte [counter]
   609                                  p_loop:
   610 000003A6 803D[634B0000]00        	cmp	byte [srb], 0
   611 000003AD 7610                    	jna	short q_loop
   612                                  
   613 000003AF C605[634B0000]00        	mov	byte [srb], 0
   614                                  modp_gs:
   615                                  	; 24/08/2020
   616                                  	;mov	edi, audio_buffer
   617                                  	;mov	edx, BUFFERSIZE
   618 000003B6 E826FFFFFF              	call	loadFromFile
   619 000003BB 723A                    	jc	short q_return
   620                                  
   621                                  	; 23/08/2020
   622 000003BD EB6B                    	jmp	r_loop
   623                                  q_loop:
   624                                  	; 24/08/2020
   625 000003BF F605[654B0000]3F        	test	byte [counter], 63
   626 000003C6 7562                    	jnz	short r_loop
   627                                  k_loop:
   628 000003C8 B401                    	mov     ah, 1		; any key pressed?
   629 000003CA CD32                    	int     32h		; no, Loop.
   630 000003CC 745C                    	jz	short r_loop
   631                                  
   632 000003CE B400                    	mov     ah, 0		; flush key buffer...
   633 000003D0 CD32                    	int     32h
   634                                  
   635                                  	; 19/10/2017 (modplay6.s)
   636 000003D2 3C20                    	cmp	al, 20h
   637 000003D4 740E                    	je	short change_pan
   638                                  	; 09/10/2017 (playmod5.s)
   639 000003D6 3C2B                    	cmp	al, '+' ; increase sound volume
   640 000003D8 741E                    	je	short inc_volume_level
   641 000003DA 3C2D                    	cmp	al, '-'
   642 000003DC 743D                    	je	short dec_volume_level
   643                                  
   644                                  	; 19/10/2017 (modplay6.s)
   645 000003DE 24DF                    	and	al, 0DFh
   646 000003E0 3C50                    	cmp	al, 'P'
   647 000003E2 7513                    	jne	short q_return
   648                                  
   649                                  change_pan:
   650                                  	; 19/10/2017 (modplay6.s)
   651 000003E4 8A0D[70550000]          	mov	cl, [pan_shift]
   652 000003EA FEC1                    	inc	cl
   653 000003EC 80E103                  	and	cl, 3
   654 000003EF 880D[70550000]          	mov	[pan_shift], cl
   655 000003F5 EB33                    	jmp	short r_loop
   656                                  
   657                                  q_return:
   658 000003F7 C3                      	retn
   659                                  
   660                                  	; 09/10/2017 (playmod5.s)
   661                                  	; 24/06/2017 (wavplay2.s)
   662                                  inc_volume_level:
   663 000003F8 8A0D[71550000]          	mov	cl, [volume_level]
   664 000003FE 80F91F                  	cmp	cl, 1Fh ; 31
   665 00000401 7327                    	jnb	short r_loop
   666 00000403 FEC1                    	inc	cl
   667                                  change_volume_level:
   668 00000405 880D[71550000]          	mov	[volume_level], cl
   669 0000040B 88CD                    	mov	ch, cl
   670                                  	; Set Master Volume Level
   671                                  	sys	_audio, 0B00h
   671                              <1> 
   671                              <1> 
   671                              <1> 
   671                              <1> 
   671                              <1>  %if %0 >= 2
   671 0000040D BB000B0000          <1>  mov ebx, %2
   671                              <1>  %if %0 >= 3
   671                              <1>  mov ecx, %3
   671                              <1>  %if %0 = 4
   671                              <1>  mov edx, %4
   671                              <1>  %endif
   671                              <1>  %endif
   671                              <1>  %endif
   671 00000412 B820000000          <1>  mov eax, %1
   671                              <1> 
   671 00000417 CD40                <1>  int 40h
   672 00000419 EB0F                    	jmp	short r_loop
   673                                  dec_volume_level:
   674 0000041B 8A0D[71550000]          	mov	cl, [volume_level]
   675 00000421 80F901                  	cmp	cl, 1 ; 1
   676 00000424 7604                    	jna	short r_loop
   677 00000426 FEC9                    	dec	cl
   678 00000428 EBDB                    	jmp	short change_volume_level
   679                                  
   680                                  r_loop:
   681                                  	; 24/08/2020
   682 0000042A FE05[654B0000]          	inc	byte [counter]
   683 00000430 758D                    	jnz	short q_loop
   684                                  
   685                                  	; 23/08/2020
   686 00000432 F605[E84A0000]02        	test	byte [stmo], 2
   687 00000439 0F8467FFFFFF            	jz	p_loop
   688 0000043F 803D[E94A0000]10        	cmp	byte [bps], 16
   689 00000446 0F855AFFFFFF            	jne	p_loop
   690                                  
   691                                  	; 27/10/2017
   692                                  	; Get Current DMA buffer Pointer 
   693                                  	; 23/06/2017 ('modplay6.s')
   694                                  	; bh = 15, get current pointer (DMA buffer offset)
   695                                  	; bl = 0, for PCM OUT
   696                                  	; ecx = 0
   697                                  	;
   698                                  	sys	_audio, 0F00h, 0
   698                              <1> 
   698                              <1> 
   698                              <1> 
   698                              <1> 
   698                              <1>  %if %0 >= 2
   698 0000044C BB000F0000          <1>  mov ebx, %2
   698                              <1>  %if %0 >= 3
   698 00000451 B900000000          <1>  mov ecx, %3
   698                              <1>  %if %0 = 4
   698                              <1>  mov edx, %4
   698                              <1>  %endif
   698                              <1>  %endif
   698                              <1>  %endif
   698 00000456 B820000000          <1>  mov eax, %1
   698                              <1> 
   698 0000045B CD40                <1>  int 40h
   699                                  
   700                                  	; 28/10/2017
   701 0000045D 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   702                                  	; 23/06/2017
   703 0000045F BE[00000100]            	mov     esi, DMA_Buffer
   704 00000464 01C6                    	add     esi, eax	; add offset value
   705                                  	; 24/06/2017
   706 00000466 B9[00FC0100]            	mov	ecx, DMA_Buffer + (65536 - (256*4))
   707 0000046B 39CE                    	cmp	esi, ecx 
   708 0000046D 7602                    	jna	short _7
   709 0000046F 89CE                    	mov	esi, ecx
   710                                  _7:
   711                                  	; 23/10/2017 ('tmodplay.s')
   712 00000471 E875020000              	call	drawscopes
   713                                  
   714 00000476 E92BFFFFFF              	jmp	p_loop
   715                                  
   716                                  ;=============================================================================
   717                                  ; 
   718                                  ;=============================================================================
   719                                  
   720                                  ;dword2str:
   721                                  ;	; 13/11/2016 - Erdogan Tan 
   722                                  ;	; eax = dword value
   723                                  ;	;
   724                                  ;	call	dwordtohex
   725                                  ;	mov	[dword_str], edx
   726                                  ;	mov	[dword_str+4], eax
   727                                  ;	mov	si, dword_str
   728                                  ;	retn
   729                                  
   730                                  	; 05/03/2017 (TRDOS 386)
   731                                  	; trdos386.s (unix386.s) - 10/05/2015
   732                                  	; Convert binary number to hexadecimal string
   733                                  
   734                                  ;bytetohex:
   735                                  ;	; INPUT ->
   736                                  ;	; 	AL = byte (binary number)
   737                                  ;	; OUTPUT ->
   738                                  ;	;	AX = hexadecimal string
   739                                  ;	;
   740                                  ;	push	ebx
   741                                  ;	movzx	ebx, al
   742                                  ;	shr	bl, 4
   743                                  ;	mov	bl, [ebx+hex_chars] 	 	
   744                                  ;	xchg	bl, al
   745                                  ;	and	bl, 0Fh
   746                                  ;	mov	ah, [ebx+hex_chars] 
   747                                  ;	pop	ebx	
   748                                  ;	retn
   749                                  
   750                                  ;wordtohex:
   751                                  ;	; INPUT ->
   752                                  ;	; 	AX = word (binary number)
   753                                  ;	; OUTPUT ->
   754                                  ;	;	EAX = hexadecimal string
   755                                  ;	;
   756                                  ;	push	ebx
   757                                  ;	xor	ebx, ebx
   758                                  ;	xchg	ah, al
   759                                  ;	push	eax
   760                                  ;	mov	bl, ah
   761                                  ;	shr	bl, 4
   762                                  ;	mov	al, [ebx+hex_chars] 	 	
   763                                  ;	mov	bl, ah
   764                                  ;	and	bl, 0Fh
   765                                  ;	mov	ah, [ebx+hex_chars]
   766                                  ;	shl	eax, 16
   767                                  ;	pop	eax
   768                                  ;	pop	ebx
   769                                  ;	jmp	short bytetohex
   770                                  
   771                                  ;dwordtohex:
   772                                  ;	; INPUT ->
   773                                  ;	; 	EAX = dword (binary number)
   774                                  ;	; OUTPUT ->
   775                                  ;	;	EDX:EAX = hexadecimal string
   776                                  ;	;
   777                                  ;	push	eax
   778                                  ;	shr	eax, 16
   779                                  ;	call	wordtohex
   780                                  ;	mov	edx, eax
   781                                  ;	pop	eax
   782                                  ;	call	wordtohex
   783                                  ;	retn
   784                                  
   785                                  	; 19/06/2017
   786                                  	; 05/03/2017 (TRDOS 386)
   787                                  	; 13/11/2016 - Erdogan Tan
   788                                  write_audio_dev_info:
   789                                  	; BUS/DEV/FN
   790                                  	;	00000000BBBBBBBBDDDDDFFF00000000
   791                                  	; DEV/VENDOR
   792                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
   793                                  
   794 0000047B 8B35[584B0000]          	mov	esi, [dev_vendor]
   795 00000481 6689F0                  	mov	ax, si
   796 00000484 0FB6D8                  	movzx	ebx, al
   797 00000487 88DA                    	mov	dl, bl
   798 00000489 80E30F                  	and	bl, 0Fh
   799 0000048C 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   800 00000492 A2[2B4A0000]            	mov	[msgVendorId+3], al
   801 00000497 88D3                    	mov	bl, dl
   802 00000499 C0EB04                  	shr	bl, 4
   803 0000049C 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   804 000004A2 A2[2A4A0000]            	mov	[msgVendorId+2], al
   805 000004A7 88E3                    	mov	bl, ah
   806 000004A9 88DA                    	mov	dl, bl
   807 000004AB 80E30F                  	and	bl, 0Fh
   808 000004AE 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   809 000004B4 A2[294A0000]            	mov	[msgVendorId+1], al
   810 000004B9 88D3                    	mov	bl, dl
   811 000004BB C0EB04                  	shr	bl, 4
   812 000004BE 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   813 000004C4 A2[284A0000]            	mov	[msgVendorId], al
   814 000004C9 C1EE10                  	shr	esi, 16
   815 000004CC 6689F0                  	mov	ax, si
   816 000004CF 88C3                    	mov	bl, al
   817 000004D1 88DA                    	mov	dl, bl
   818 000004D3 80E30F                  	and	bl, 0Fh
   819 000004D6 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   820 000004DC A2[3C4A0000]            	mov	[msgDevId+3], al
   821 000004E1 88D3                    	mov	bl, dl
   822 000004E3 C0EB04                  	shr	bl, 4
   823 000004E6 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   824 000004EC A2[3B4A0000]            	mov	[msgDevId+2], al
   825 000004F1 88E3                    	mov	bl, ah
   826 000004F3 88DA                    	mov	dl, bl
   827 000004F5 80E30F                  	and	bl, 0Fh
   828 000004F8 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   829 000004FE A2[3A4A0000]            	mov	[msgDevId+1], al
   830 00000503 88D3                    	mov	bl, dl
   831 00000505 C0EB04                  	shr	bl, 4
   832 00000508 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   833 0000050E A2[394A0000]            	mov	[msgDevId], al
   834                                  
   835 00000513 8B35[5C4B0000]          	mov	esi, [bus_dev_fn]
   836 00000519 C1EE08                  	shr	esi, 8
   837 0000051C 6689F0                  	mov	ax, si
   838 0000051F 88C3                    	mov	bl, al
   839 00000521 88DA                    	mov	dl, bl
   840 00000523 80E307                  	and	bl, 7 ; bit 0,1,2
   841 00000526 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   842 0000052C A2[604A0000]            	mov	[msgFncNo+1], al
   843 00000531 88D3                    	mov	bl, dl
   844 00000533 C0EB03                  	shr	bl, 3
   845 00000536 88DA                    	mov	dl, bl
   846 00000538 80E30F                  	and	bl, 0Fh
   847 0000053B 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   848 00000541 A2[524A0000]            	mov	[msgDevNo+1], al
   849 00000546 88D3                    	mov	bl, dl
   850 00000548 C0EB04                  	shr	bl, 4
   851 0000054B 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   852 00000551 A2[514A0000]            	mov	[msgDevNo], al
   853 00000556 88E3                    	mov	bl, ah
   854 00000558 88DA                    	mov	dl, bl
   855 0000055A 80E30F                  	and	bl, 0Fh
   856 0000055D 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   857 00000563 A2[464A0000]            	mov	[msgBusNo+1], al
   858 00000568 88D3                    	mov	bl, dl
   859 0000056A C0EB04                  	shr	bl, 4
   860 0000056D 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   861 00000573 A2[454A0000]            	mov	[msgBusNo], al
   862                                  
   863 00000578 66A1[604B0000]          	mov	ax, [ac97_io_base]
   864 0000057E 88C3                    	mov	bl, al
   865 00000580 88DA                    	mov	dl, bl
   866 00000582 80E30F                  	and	bl, 0Fh
   867 00000585 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   868 0000058B A2[794A0000]            	mov	[msgIOBaseAddr+3], al
   869 00000590 88D3                    	mov	bl, dl
   870 00000592 C0EB04                  	shr	bl, 4
   871 00000595 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   872 0000059B A2[784A0000]            	mov	[msgIOBaseAddr+2], al
   873 000005A0 88E3                    	mov	bl, ah
   874 000005A2 88DA                    	mov	dl, bl
   875 000005A4 80E30F                  	and	bl, 0Fh
   876 000005A7 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   877 000005AD A2[774A0000]            	mov	[msgIOBaseAddr+1], al
   878 000005B2 88D3                    	mov	bl, dl
   879 000005B4 C0EB04                  	shr	bl, 4
   880 000005B7 8A83[E6490000]          	mov	al, [ebx+hex_chars]
   881 000005BD A2[764A0000]            	mov	[msgIOBaseAddr], al
   882                                  
   883                                  	; 24/11/2016
   884 000005C2 30E4                    	xor	ah, ah
   885 000005C4 A0[624B0000]            	mov	al, [ac97_int_ln_reg]
   886 000005C9 B10A                    	mov	cl, 10
   887 000005CB F6F1                    	div	cl
   888 000005CD 660105[814A0000]        	add	[msgIRQ], ax
   889 000005D4 20C0                    	and	al, al
   890 000005D6 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
   891 000005D8 A0[824A0000]            	mov	al, [msgIRQ+1]
   892 000005DD B420                    	mov	ah, ' '
   893 000005DF 66A3[814A0000]          	mov	[msgIRQ], ax
   894                                  _w_ac97imsg_:
   895                                  	; EBX = Message address
   896                                  	; ECX = Max. message length (or stop on ZERO character)
   897                                  	;	(1 to 255)
   898                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
   899                                       	sys 	_msg, msgAC97Info, 255, 07h
   899                              <1> 
   899                              <1> 
   899                              <1> 
   899                              <1> 
   899                              <1>  %if %0 >= 2
   899 000005E5 BB[F7490000]        <1>  mov ebx, %2
   899                              <1>  %if %0 >= 3
   899 000005EA B9FF000000          <1>  mov ecx, %3
   899                              <1>  %if %0 = 4
   899 000005EF BA07000000          <1>  mov edx, %4
   899                              <1>  %endif
   899                              <1>  %endif
   899                              <1>  %endif
   899 000005F4 B823000000          <1>  mov eax, %1
   899                              <1> 
   899 000005F9 CD40                <1>  int 40h
   900 000005FB C3                              retn
   901                                  
   902                                  	; 24/08/2020
   903                                  write_wav_file_info:
   904                                  	; 01/05/2017
   905                                  	sys	_msg, msgWavFileName, 255, 0Fh
   905                              <1> 
   905                              <1> 
   905                              <1> 
   905                              <1> 
   905                              <1>  %if %0 >= 2
   905 000005FC BB[864A0000]        <1>  mov ebx, %2
   905                              <1>  %if %0 >= 3
   905 00000601 B9FF000000          <1>  mov ecx, %3
   905                              <1>  %if %0 = 4
   905 00000606 BA0F000000          <1>  mov edx, %4
   905                              <1>  %endif
   905                              <1>  %endif
   905                              <1>  %endif
   905 0000060B B823000000          <1>  mov eax, %1
   905                              <1> 
   905 00000610 CD40                <1>  int 40h
   906                                  	sys	_msg, wav_file_name, 255, 0Fh
   906                              <1> 
   906                              <1> 
   906                              <1> 
   906                              <1> 
   906                              <1>  %if %0 >= 2
   906 00000612 BB[084B0000]        <1>  mov ebx, %2
   906                              <1>  %if %0 >= 3
   906 00000617 B9FF000000          <1>  mov ecx, %3
   906                              <1>  %if %0 = 4
   906 0000061C BA0F000000          <1>  mov edx, %4
   906                              <1>  %endif
   906                              <1>  %endif
   906                              <1>  %endif
   906 00000621 B823000000          <1>  mov eax, %1
   906                              <1> 
   906 00000626 CD40                <1>  int 40h
   907                                  
   908                                  write_sample_rate:
   909                                  	; 01/05/2017
   910 00000628 66A1[EA4A0000]          	mov	ax, [sample_rate]
   911                                  	; ax = sample rate (hertz)
   912 0000062E 31D2                    	xor	edx, edx
   913 00000630 66B90A00                	mov	cx, 10
   914 00000634 66F7F1                  	div	cx
   915 00000637 0015[AB4A0000]          	add	[msgHertz+4], dl
   916 0000063D 29D2                    	sub	edx, edx
   917 0000063F 66F7F1                  	div	cx
   918 00000642 0015[AA4A0000]          	add	[msgHertz+3], dl
   919 00000648 29D2                    	sub	edx, edx
   920 0000064A 66F7F1                  	div	cx
   921 0000064D 0015[A94A0000]          	add	[msgHertz+2], dl
   922 00000653 29D2                    	sub	edx, edx
   923 00000655 66F7F1                  	div	cx
   924 00000658 0015[A84A0000]          	add	[msgHertz+1], dl
   925 0000065E 0005[A74A0000]          	add	[msgHertz], al
   926                                  	
   927                                  	sys	_msg, msgSampleRate, 255, 0Fh
   927                              <1> 
   927                              <1> 
   927                              <1> 
   927                              <1> 
   927                              <1>  %if %0 >= 2
   927 00000664 BB[984A0000]        <1>  mov ebx, %2
   927                              <1>  %if %0 >= 3
   927 00000669 B9FF000000          <1>  mov ecx, %3
   927                              <1>  %if %0 = 4
   927 0000066E BA0F000000          <1>  mov edx, %4
   927                              <1>  %endif
   927                              <1>  %endif
   927                              <1>  %endif
   927 00000673 B823000000          <1>  mov eax, %1
   927                              <1> 
   927 00000678 CD40                <1>  int 40h
   928                                  
   929 0000067A BE[C24A0000]            	mov	esi, msg16Bits
   930 0000067F 803D[E94A0000]10        	cmp	byte [bps], 16
   931 00000686 7405                    	je	short wsr_1
   932 00000688 BE[B24A0000]            	mov	esi, msg8Bits
   933                                  wsr_1:
   934                                  	sys	_msg, esi, 255, 0Fh
   934                              <1> 
   934                              <1> 
   934                              <1> 
   934                              <1> 
   934                              <1>  %if %0 >= 2
   934 0000068D 89F3                <1>  mov ebx, %2
   934                              <1>  %if %0 >= 3
   934 0000068F B9FF000000          <1>  mov ecx, %3
   934                              <1>  %if %0 = 4
   934 00000694 BA0F000000          <1>  mov edx, %4
   934                              <1>  %endif
   934                              <1>  %endif
   934                              <1>  %endif
   934 00000699 B823000000          <1>  mov eax, %1
   934                              <1> 
   934 0000069E CD40                <1>  int 40h
   935                                  
   936 000006A0 BE[BB4A0000]            	mov	esi, msgMono
   937 000006A5 803D[E84A0000]01        	cmp	byte [stmo], 1
   938 000006AC 7405                    	je	short wsr_2
   939 000006AE BE[CC4A0000]            	mov	esi, msgStereo		
   940                                  wsr_2:
   941                                  	sys	_msg, esi, 255, 0Fh
   941                              <1> 
   941                              <1> 
   941                              <1> 
   941                              <1> 
   941                              <1>  %if %0 >= 2
   941 000006B3 89F3                <1>  mov ebx, %2
   941                              <1>  %if %0 >= 3
   941 000006B5 B9FF000000          <1>  mov ecx, %3
   941                              <1>  %if %0 = 4
   941 000006BA BA0F000000          <1>  mov edx, %4
   941                              <1>  %endif
   941                              <1>  %endif
   941                              <1>  %endif
   941 000006BF B823000000          <1>  mov eax, %1
   941                              <1> 
   941 000006C4 CD40                <1>  int 40h
   942 000006C6 C3                              retn
   943                                  
   944                                  ;=============================================================================
   945                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
   946                                  ;=============================================================================
   947                                  
   948                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
   949                                  
   950                                  ;-----------------------------------------------------------------------------
   951                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
   952                                  ;-----------------------------------------------------------------------------
   953                                  	; 22/10/2017
   954                                  setgraphmode:
   955                                  	;pushad
   956 000006C7 66B81200                	mov	ax,0012h
   957                                  	;int	10h
   958 000006CB CD31                    	int 	31h
   959 000006CD 66BAC003                	mov	dx,3C0h
   960 000006D1 30C0                    	xor	al,al
   961                                  setgraphmodel0:
   962                                  	;out	dx,al
   963 000006D3 B401                    	mov	ah, 1 ; outb
   964 000006D5 CD34                    	int	34h
   965                                  	;out	dx, al
   966                                  	;mov	ah, 1
   967 000006D7 CD34                    	int	34h
   968 000006D9 FEC0                    	inc	al
   969 000006DB 3C10                    	cmp	al, 10h
   970 000006DD 72F4                    	jb	short setgraphmodel0
   971 000006DF B020                    	mov	al, 20h
   972                                  	;out	dx, al
   973                                  	;mov	ah, 1
   974 000006E1 CD34                    	int	34h
   975                                  	;popad
   976 000006E3 C3                      	retn
   977                                  
   978                                  ;-----------------------------------------------------------------------------
   979                                  ; settextmode - restore the VGA 80x25x16 text mode
   980                                  ;-----------------------------------------------------------------------------
   981                                  	; 22/10/2017
   982                                  settextmode:
   983                                  	;pushad
   984 000006E4 66B80300                	mov	ax, 0003h
   985                                  	;int	10h
   986 000006E8 CD31                    	int	31h
   987                                  	;popad
   988 000006EA C3                      	retn
   989                                  
   990                                  ;-----------------------------------------------------------------------------
   991                                  ; drawscopes - draw the track voices sample scopes
   992                                  ; In:
   993                                  ;  ESI = (current) sample buffer
   994                                  ;-----------------------------------------------------------------------------
   995                                  	; 29/10/2017
   996                                  	; 28/10/2017
   997                                  	; (ESI = Current DMA buffer offset)
   998                                  	; 27/10/2017
   999                                  	; 26/10/2017
  1000                                  	; 23/10/2017
  1001                                  drawscopes:
  1002                                  	;pushad
  1003                                    	;mov	esi, g_buff
  1004                                  	;mov	esi, edx
  1005 000006EB 31C9                    	xor     ecx, ecx	
  1006 000006ED 31D2                    	xor     edx, edx
  1007 000006EF 31FF                    	xor	edi, edi
  1008                                  drawscope0:
  1009 000006F1 66AD                    	lodsw
  1010 000006F3 80F480                  	xor	ah, 80h
  1011 000006F6 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  1012 000006F9 66D1E3                  	shl	bx, 1
  1013 000006FC 668B83[704B0000]        	mov	ax, [RowOfs+ebx]
  1014 00000703 668987[704D0000]        	mov	[NewScope_L+edi], ax
  1015 0000070A 30FF                    	xor	bh, bh
  1016 0000070C 66AD                    	lodsw
  1017 0000070E 80F480                  	xor	ah, 80h
  1018 00000711 88E3                    	mov	bl, ah	; Right Channel
  1019 00000713 66D1E3                  	shl	bx, 1
  1020 00000716 668B83[704B0000]        	mov	ax, [RowOfs+ebx]
  1021 0000071D 668987[704F0000]        	mov	[NewScope_R+edi], ax
  1022 00000724 6683C702                	add	di, 2
  1023 00000728 FEC1                    	inc	cl
  1024 0000072A 75C5                    	jnz	short drawscope0	
  1025                                  
  1026 0000072C 66BAC403                        mov	dx, 3C4h
  1027                                          ;mov	ax, 0802h
  1028                                          ;out	dx, ax
  1029 00000730 66BB0208                        mov	bx, 0802h
  1030 00000734 B403                    	mov	ah, 3 ; outw
  1031 00000736 CD34                    	int	34h
  1032 00000738 66BACE03                	mov	dx, 3CEh
  1033 0000073C B008                            mov	al, 08h
  1034                                         ;out	dx, al
  1035 0000073E B401                            mov	ah, 1 ; outb
  1036 00000740 CD34                    	int	34h
  1037 00000742 6642                    	inc	dx
  1038                                  
  1039                                  	; 26/10/2017
  1040 00000744 31F6                            xor	esi, esi
  1041                                         ;xor	edi, edi
  1042 00000746 BB45060A00                      mov     ebx, 0A0645h
  1043                                  drawscopel4:
  1044 0000074B B080                            mov     al, 80h
  1045                                  drawscopel2:
  1046 0000074D 50                              push    eax ; *
  1047 0000074E 52                              push    edx ; **
  1048                                  	;out	dx, al
  1049 0000074F B401                    	mov	ah, 1 ; outb
  1050 00000751 CD34                    	int	34h
  1051                                  
  1052 00000753 B4FF                            mov	ah, 0FFh
  1053                                          ;mov	ecx, 32
  1054 00000755 B120                    	mov	cl, 32
  1055 00000757 28C0                    	sub     al, al
  1056                                  drawscopel3:
  1057                                  	; 23/10/2017
  1058 00000759 668B96[70510000]                mov	dx, [OldScope_L+esi]
  1059 00000760 663B96[704D0000]                cmp	dx, [NewScope_L+esi]
  1060 00000767 7414                            je	short drawscopef3
  1061 00000769 88041A                          mov	[edx+ebx], al ; L
  1062 0000076C 668B96[704D0000]                mov     dx, [NewScope_L+esi]
  1063 00000773 88241A                  	mov	[edx+ebx], ah ; L
  1064 00000776 668996[70510000]                mov     [OldScope_L+esi], dx
  1065                                  drawscopef3:
  1066                                  	; 27/10/2017
  1067 0000077D 668B96[70530000]                mov	dx, [OldScope_R+esi]
  1068 00000784 663B96[704F0000]                cmp	dx, [NewScope_R+esi]
  1069 0000078B 7416                            je	short drawscopef4
  1070 0000078D 88441A26                	mov	[edx+ebx+38], al ; R
  1071 00000791 668B96[704F0000]                mov     dx, [NewScope_R+esi]
  1072 00000798 88641A26                        mov	[edx+ebx+38], ah ; R
  1073 0000079C 668996[70530000]                mov     [OldScope_R+esi], dx
  1074                                  drawscopef4:
  1075 000007A3 83C610                  	add	esi, 2*8
  1076 000007A6 43                      	inc	ebx
  1077 000007A7 E2B0                    	loop    drawscopel3
  1078                                  
  1079 000007A9 5A                              pop     edx ; **
  1080 000007AA 58                              pop     eax ; *
  1081 000007AB 81EEFE010000            	sub	esi, 2*256-2
  1082 000007B1 83EB20                  	sub	ebx, 32
  1083 000007B4 D0E8                            shr     al, 1
  1084 000007B6 7595                            jnz	short drawscopel2
  1085                                  	;popad
  1086 000007B8 C3                              retn
  1087                                  
  1088                                  ;=============================================================================
  1089                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  1090                                  ;=============================================================================
  1091                                  
  1092                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  1093                                  
  1094                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  1095                                  
  1096                                  ;-----------------------------------------------------------------------------
  1097                                  ; EQUATES AND STRUCTURES
  1098                                  ;-----------------------------------------------------------------------------
  1099                                  
  1100                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  1101                                  ID_ILBM equ 4D424C49h
  1102                                  ID_BMHD equ 44484D42h
  1103                                  ID_CMAP equ 50414D43h
  1104                                  ID_BODY equ 59444F42h
  1105                                  
  1106                                  struc Form			; IFF/ILBM header file format
  1107 00000000 <res 00000004>            .ID:		resd 1
  1108 00000004 <res 00000004>            .Length:	resd 1
  1109 00000008 <res 00000004>            .Type:	resd 1
  1110                                    .size:
  1111                                  endstruc
  1112                                  
  1113                                  struc Chunk			; IFF/ILBM header chunk format
  1114 00000000 <res 00000004>            .ID:		resd 1
  1115 00000004 <res 00000004>            .Length:	resd 1
  1116                                    .size:	
  1117                                  endstruc
  1118                                  
  1119                                  struc BMHD			; IFF/ILBM BMHD chunk format
  1120 00000000 <res 00000002>            .Width: 	resw 1
  1121 00000002 <res 00000002>            .Height:	resw 1
  1122 00000004 <res 00000002>            .PosX:	resw 1
  1123 00000006 <res 00000002>            .PosY:	resw 1
  1124 00000008 <res 00000001>            .Planes:	resb 1
  1125 00000009 <res 00000001>            .Masking:	resb 1
  1126 0000000A <res 00000001>            .Compression:	resb 1
  1127 0000000B <res 00000001>            .Pad:		resb 1
  1128 0000000C <res 00000002>            .Transparent:	resw 1
  1129 0000000E <res 00000001>            .AspectX	resb 1
  1130 0000000F <res 00000001>            .AspectY:	resb 1
  1131 00000010 <res 00000002>            .PageWidth:	resw 1
  1132 00000012 <res 00000002>            .PageHeight:	resw 1
  1133                                    .size:	
  1134                                  endstruc
  1135                                  
  1136                                  struc CMAP			; IFF/ILBM CMAP chunk format
  1137 00000000 <res 00000300>            .Colors:	resb 768
  1138                                    .size:	
  1139                                  endstruc
  1140                                  
  1141                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  1142                                  
  1143                                  ;------------------------------------------------------------------------------
  1144                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  1145                                  ;         a value in little/big endian form to big/little endian form.
  1146                                  ;------------------------------------------------------------------------------
  1147                                  %macro	bswap   1
  1148                                          xchg    al, ah
  1149                                          rol     eax, 16
  1150                                          xchg    al, ah
  1151                                  %endmacro
  1152                                  
  1153                                  ;------------------------------------------------------------------------------
  1154                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  1155                                  ; In:
  1156                                  ;  ESI = IFF/ILBM image file address
  1157                                  ;------------------------------------------------------------------------------
  1158                                  putlbm:
  1159 000007B9 60                              pushad
  1160                                  
  1161                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  1162                                  
  1163 000007BA 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  1164 000007C0 7551                            jne     short putlbmd0
  1165 000007C2 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  1166 000007C9 7548                            jne     short putlbmd0
  1167                                  
  1168                                  ; get the IFF/ILBM file length in bytes
  1169                                  
  1170 000007CB 8B4604                          mov     eax, [esi+Form.Length]
  1171                                          bswap   eax
  1171 000007CE 86C4                <1>  xchg al, ah
  1171 000007D0 C1C010              <1>  rol eax, 16
  1171 000007D3 86C4                <1>  xchg al, ah
  1172 000007D5 89C1                            mov     ecx, eax
  1173                                  
  1174                                  ; decrease the file length and update the file pointer
  1175                                  
  1176 000007D7 83E904                          sub     ecx, 4
  1177 000007DA 83C60C                          add     esi, Form.size
  1178                                  
  1179                                  ; IFF/ILBM main parser body loop
  1180                                  
  1181                                  putlbml0:
  1182 000007DD 85C9                            test    ecx, ecx
  1183 000007DF 7E64                            jle     short putlbmd1
  1184                                  
  1185                                  ; get the next chunk ID and length in bytes
  1186                                  
  1187 000007E1 8B1E                            mov     ebx, [esi+Chunk.ID]
  1188 000007E3 8B4604                          mov     eax, [esi+Chunk.Length]
  1189                                          bswap   eax
  1189 000007E6 86C4                <1>  xchg al, ah
  1189 000007E8 C1C010              <1>  rol eax, 16
  1189 000007EB 86C4                <1>  xchg al, ah
  1190 000007ED 93                              xchg    ebx, eax
  1191 000007EE 83C608                          add     esi, Chunk.size
  1192                                  
  1193                                  ; word align the chunk length and decrease the file length counter
  1194                                  
  1195 000007F1 43                              inc     ebx
  1196 000007F2 80E3FE                          and     bl, 0FEh ; ~1
  1197 000007F5 83E908                          sub     ecx, Chunk.size
  1198 000007F8 29D9                            sub     ecx, ebx
  1199                                  
  1200                                  ; check for the BMHD/CMAP/BODY chunk headers
  1201                                  
  1202 000007FA 3D424D4844                      cmp     eax, ID_BMHD
  1203 000007FF 7415                            je      short putlbmf0
  1204 00000801 3D434D4150                      cmp     eax, ID_CMAP
  1205 00000806 7440                            je      short putlbmf1
  1206 00000808 3D424F4459                      cmp     eax, ID_BODY
  1207 0000080D 7455                            je      short putlbmf2
  1208                                  
  1209                                  ; advance to the next IFF/ILBM chunk structure
  1210                                  
  1211                                  putlbmc0:
  1212 0000080F 01DE                            add     esi, ebx
  1213 00000811 EBCA                            jmp     short putlbml0
  1214                                  
  1215                                  putlbmd0:
  1216 00000813 F9                              stc
  1217 00000814 61                              popad
  1218 00000815 C3                              retn
  1219                                  
  1220                                  ; process the BMHD bitmap header chunk
  1221                                  
  1222                                  putlbmf0:
  1223 00000816 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  1224 0000081A 75F7                            jne     short putlbmd0
  1225 0000081C 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  1226 00000820 75F1                            jne     short putlbmd0
  1227 00000822 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  1228 00000826 75EB                            jne     short putlbmd0
  1229 00000828 0FB706                          movzx   eax, word [esi+BMHD.Width]
  1230 0000082B 86C4                            xchg    al, ah
  1231 0000082D 83C007                          add     eax, 7
  1232 00000830 C1E803                          shr     eax, 3
  1233 00000833 A3[E04A0000]                    mov     [picture.width], eax
  1234 00000838 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  1235 0000083C 86C4                            xchg    al, ah
  1236 0000083E A3[E44A0000]                    mov     [picture.height], eax
  1237 00000843 EBCA                            jmp     short putlbmc0
  1238                                  
  1239                                  putlbmd1:
  1240 00000845 F8                              clc
  1241 00000846 61                              popad
  1242 00000847 C3                              retn
  1243                                  
  1244                                  ; process the CMAP colormap chunk
  1245                                  
  1246                                  putlbmf1:
  1247 00000848 66BAC803                        mov     dx, 3C8h
  1248 0000084C 30C0                            xor     al, al
  1249                                          ;out	dx, al
  1250 0000084E B401                    	mov	ah, 1 ; outb
  1251 00000850 CD34                    	int	34h
  1252 00000852 6642                            inc     dx
  1253                                  putlbml1:
  1254 00000854 8A06                            mov     al, [esi]
  1255 00000856 C0E802                          shr     al, 2
  1256                                          ;out	dx, al
  1257                                  	;mov	ah, 1 ; outb
  1258 00000859 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  1259 0000085B 46                              inc     esi
  1260 0000085C 4B                              dec     ebx
  1261 0000085D 7FF5                            jg      short putlbml1
  1262 0000085F E979FFFFFF                      jmp     putlbml0
  1263                                  
  1264                                  ; process the BODY bitmap body chunk
  1265                                  
  1266                                  putlbmf2:
  1267 00000864 60                              pushad
  1268 00000865 BF00000A00                      mov     edi, 0A0000h
  1269                                          ;cld
  1270 0000086A 66BACE03                        mov     dx, 3CEh
  1271                                          ;mov	ax, 0FF08h
  1272                                          ;out	dx, ax
  1273 0000086E 66BB08FF                	mov	bx, 0FF08h
  1274 00000872 B403                    	mov	ah, 3 ; outw
  1275 00000874 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  1276 00000876 66BAC403                        mov     dx, 3C4h
  1277 0000087A B002                            mov     al, 02h
  1278                                          ;out	dx, al
  1279 0000087C B401                    	mov	ah, 1 ; outb
  1280 0000087E CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  1281 00000880 6642                            inc     dx
  1282 00000882 8B0D[E44A0000]                  mov     ecx, [picture.height]
  1283                                  putlbml2:
  1284 00000888 51                              push    ecx
  1285 00000889 B011                            mov     al, 11h
  1286                                  putlbml3:
  1287 0000088B 50                              push    eax
  1288 0000088C 57                              push    edi
  1289                                          ;out	dx, al
  1290 0000088D B401                    	mov	ah, 1 ; outb
  1291 0000088F CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  1292 00000891 8B1D[E04A0000]                  mov     ebx, [picture.width]
  1293                                  putlbml4:
  1294 00000897 AC                              lodsb
  1295 00000898 84C0                            test    al, al
  1296 0000089A 7C0A                            jl      short putlbmf3
  1297 0000089C 0FB6C8                          movzx   ecx, al
  1298 0000089F 41                              inc     ecx
  1299 000008A0 29CB                            sub     ebx, ecx
  1300 000008A2 F3A4                            rep     movsb
  1301 000008A4 EB0B                            jmp     short putlbmc4
  1302                                  putlbmf3:
  1303 000008A6 F6D8                            neg     al
  1304 000008A8 0FB6C8                          movzx   ecx, al
  1305 000008AB 41                              inc     ecx
  1306 000008AC 29CB                            sub     ebx, ecx
  1307 000008AE AC                              lodsb
  1308 000008AF F3AA                            rep     stosb
  1309                                  putlbmc4:
  1310 000008B1 85DB                            test    ebx, ebx
  1311 000008B3 7FE2                            jg      short putlbml4
  1312 000008B5 5F                              pop     edi
  1313 000008B6 58                              pop     eax
  1314 000008B7 00C0                            add     al, al
  1315 000008B9 73D0                            jnc     short putlbml3
  1316 000008BB 83C750                          add     edi, 80
  1317 000008BE 59                              pop     ecx
  1318 000008BF E2C7                            loop    putlbml2
  1319 000008C1 61                      	popad
  1320 000008C2 E948FFFFFF                      jmp	putlbmc0
  1321                                  
  1322                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  1323                                  ;------------------------------------------------------------------------------
  1324                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  1325                                  ;  ESI = IFF/ILBM image file address
  1326                                  ;------------------------------------------------------------------------------
  1327                                  
  1328                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  1329                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  1330                                  ;       MODStopModule();
  1331                                  ;       MODFreeModule(Song);
  1332                                  ;       return;
  1333                                  ;   }
  1334                                  ;   setgraphmode();
  1335                                  ;   putlbm(Logo);
  1336                                  ;   while (!kbhit())
  1337                                  ;       drawscopes(Song->NumTracks);
  1338                                  ;   settextmode();
  1339                                  ;   free(Logo);
  1340                                  ;   MODStopModule();
  1341                                  ;   MODFreeModule(Song);
  1342                                  
  1343                                  ;loadlbm:
  1344                                  ;	; ebx = ASCIIZ file name address
  1345                                  ;	; ecx = open mode (0 = open for read)	
  1346                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  1347                                  ;	jc	short loadlbm_retn
  1348                                  ;
  1349                                  ;	mov     [LBM_FileHandle], eax
  1350                                  ;
  1351                                  ;	; get file size by moving file pointer to the end of file
  1352                                  ;	; ebx = file handle/number
  1353                                  ;	; ecx : offset = 0
  1354                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  1355                                  ;	sys	_seek, eax, 0, 2
  1356                                  ;	jc	short loadlbm_cf
  1357                                  ;
  1358                                  ;	mov	[LBM_FileSize], eax
  1359                                  ;
  1360                                  ;	; move file pointer to the beginning of the file
  1361                                  ;	; ecx = 0
  1362                                  ;	; edx = 0
  1363                                  ;	;xor	ecx, ecx
  1364                                  ; 	xor	dl, dl
  1365                                  ;	; ebx = [LBM_FileHandle]
  1366                                  ;	sys	_seek
  1367                                  ;	;jc	short loadlbm_cf
  1368                                  ;
  1369                                  ;	; ebx = File handle
  1370                                  ;	; ecx = Buffer address
  1371                                  ;	; edx = Byte count
  1372                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  1373                                  ;	mov	ecx, LOGO_ADDRESS
  1374                                  ;	mov	edx, [LBM_FileSize]
  1375                                  ;	sys	_read
  1376                                  ;	jc	short loadlbm_cf
  1377                                  ;
  1378                                  ;	cmp	eax, edx  ; read count = file size ?
  1379                                  ;	;jb	short loadlbm_cf		 
  1380                                  ;loadlbm_cf:
  1381                                  ;	pushf
  1382                                  ;	sys	_close, [LBM_FileHandle]	
  1383                                  ;	popf
  1384                                  ;loadlbm_retn:
  1385                                  ;	retn	
  1386                                  ;
  1387                                  ;LOGO_FILE_NAME:
  1388                                  ;	db	"LOGO.LBM", 0
  1389                                  
  1390                                  LOGO_ERROR_MSG:
  1391 000008C7 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  1391 000008D0 64696E672074686520-
  1391 000008D9 4946462F494C424D20-
  1391 000008E2 6C6F676F2070696374-
  1391 000008EB 75726520210D0A00   
  1392                                  
  1393 000008F3 90                      align 2
  1394                                  ; 22/10/2017
  1395                                  LOGO_ADDRESS:
  1396                                  ;incbin "LOGO.LBM"	  	 
  1397                                  ; 27/10/2017
  1398 000008F4 <incbin>                incbin "TINYPLAY.LBM"
  1399                                  
  1400                                  ;=============================================================================
  1401                                  ;               preinitialized data
  1402                                  ;=============================================================================
  1403                                  	
  1404 000048E4 00                      	db	0
  1405                                  	; 23/08/2020
  1406                                  FileHandle:	
  1407 000048E5 FFFFFFFF                	dd	-1
  1408 000048E9 00                      	db	0
  1409                                  Credits:
  1410                                  msg_usage:
  1411 000048EA 54696E792057415620-     	db	'Tiny WAV Player for TRDOS 386 by Erdogan Tan',10,13
  1411 000048F3 506C6179657220666F-
  1411 000048FC 72205452444F532033-
  1411 00004905 383620627920457264-
  1411 0000490E 6F67616E2054616E0A-
  1411 00004917 0D                 
  1412 00004918 666F72205649412056-     	db 	'for VIA VT8233 Audio Controller.',10,13
  1412 00004921 543832333320417564-
  1412 0000492A 696F20436F6E74726F-
  1412 00004933 6C6C65722E0A0D     
  1413 0000493A 417567757374203230-     	db	'August 2020.',10,13
  1413 00004943 32302E0A0D         
  1414                                  credits_zero:
  1415 00004948 0A0D                    	db	10,13
  1416 0000494A 75736167653A207477-     	db	'usage: twavplay filename.wav',10,13,0
  1416 00004953 6176706C6179206669-
  1416 0000495C 6C656E616D652E7761-
  1416 00004965 760A0D00           
  1417 00004969 32342F30382F323032-     	db	'24/08/2020',10,13,0
  1417 00004972 300A0D00           
  1418                                  
  1419                                  noDevMsg:
  1420 00004976 4572726F723A20556E-     	db	'Error: Unable to find VIA VT8233 based audio device!'
  1420 0000497F 61626C6520746F2066-
  1420 00004988 696E64205649412056-
  1420 00004991 543832333320626173-
  1420 0000499A 656420617564696F20-
  1420 000049A3 64657669636521     
  1421 000049AA 0A0D00                  	db	10,13,0
  1422                                  
  1423                                  noFileErrMsg:
  1424 000049AD 4572726F723A206669-     	db	'Error: file not found.',10,13,0
  1424 000049B6 6C65206E6F7420666F-
  1424 000049BF 756E642E0A0D00     
  1425                                  
  1426                                  trdos386_err_msg:
  1427 000049C6 5452444F5320333836-     	db	'TRDOS 386 System call error !',10,13,0
  1427 000049CF 2053797374656D2063-
  1427 000049D8 616C6C206572726F72-
  1427 000049E1 20210A0D00         
  1428                                  
  1429                                  ; 13/11/2016
  1430 000049E6 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1430 000049EF 3941424344454600   
  1431                                  ;
  1432                                  msgAC97Info:	
  1433 000049F7 0D0A                    		db 0Dh, 0Ah
  1434 000049F9 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1434 00004A02 6F20436F6E74726F6C-
  1434 00004A0B 6C6572202620436F64-
  1434 00004A14 656320496E666F0D0A 
  1435 00004A1D 56656E646F72204944-     		db "Vendor ID: "
  1435 00004A26 3A20               
  1436 00004A28 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1436 00004A31 6963652049443A20   
  1437 00004A39 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1438 00004A40 4275733A20              		db "Bus: "
  1439 00004A45 303068204465766963-     msgBusNo:	db "00h Device: "
  1439 00004A4E 653A20             
  1440 00004A51 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1440 00004A5A 696F6E3A20         
  1441 00004A5F 303068                  msgFncNo	db "00h"
  1442 00004A62 0D0A                    		db 0Dh, 0Ah
  1443 00004A64 492F4F204261736520-     		db "I/O Base Address: "
  1443 00004A6D 416464726573733A20 
  1444 00004A76 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  1444 00004A7F 3A20               
  1445 00004A81 3030                    msgIRQ:		dw 3030h
  1446 00004A83 0D0A00                  		db 0Dh, 0Ah, 0
  1447                                  
  1448 00004A86 0D0A5741562046696C-     msgWavFileName:	db 0Dh, 0Ah, "WAV File Name: ",0
  1448 00004A8F 65204E616D653A2000 
  1449 00004A98 0D0A53616D706C6520-     msgSampleRate:	db 0Dh, 0Ah, "Sample Rate: "
  1449 00004AA1 526174653A20       
  1450 00004AA7 303030303020487A2C-     msgHertz:	db "00000 Hz, ", 0 
  1450 00004AB0 2000               
  1451 00004AB2 3820626974732C2000      msg8Bits:	db "8 bits, ", 0 
  1452 00004ABB 4D6F6E6F0D0A00          msgMono:	db "Mono", 0Dh, 0Ah, 0
  1453 00004AC2 313620626974732C20-     msg16Bits:	db "16 bits, ", 0 
  1453 00004ACB 00                 
  1454 00004ACC 53746572656F            msgStereo:	db "Stereo"
  1455 00004AD2 0D0A00                  nextline:	db 0Dh, 0Ah, 0
  1456                                  
  1457                                  ;=============================================================================
  1458                                  ;		uninitialized data
  1459                                  ;=============================================================================
  1460                                  
  1461                                  ; 23/08/2020
  1462                                  
  1463                                  ; BSS
  1464                                  
  1465                                  bss_start:
  1466                                  
  1467                                  ABSOLUTE bss_start
  1468                                  
  1469 00004AD5 <res 00000003>          alignb 4
  1470                                  
  1471                                  ;------------------------------------------------------------------------------
  1472                                  ; IFF/ILBM DATA
  1473                                  ;------------------------------------------------------------------------------
  1474                                  
  1475 00004AD8 <res 00000004>          LBM_FileHandle:	resd 1
  1476 00004ADC <res 00000004>          LBM_FileSize:	resd 1
  1477                                  ;
  1478 00004AE0 <res 00000004>          picture.width:	resd 1 		; current picture width and height
  1479 00004AE4 <res 00000004>          picture.height:	resd 1
  1480                                  
  1481                                  ;------------------------------------------------------------------------------
  1482                                  
  1483                                  ;alignb 4
  1484                                  
  1485 00004AE8 <res 00000001>          stmo:		resb 1 ; stereo or mono (1=stereo) 
  1486 00004AE9 <res 00000001>          bps:		resb 1 ; bits per sample (8,16)
  1487 00004AEA <res 00000002>          sample_rate:	resw 1 ; Sample Frequency (Hz)
  1488                                  
  1489 00004AEC <res 0000001C>          smpRBuff:	resw 14 
  1490                                  
  1491                                  wav_file_name:
  1492 00004B08 <res 00000050>          		resb 80 ; wave file, path name (<= 80 bytes)
  1493                                  
  1494                                  alignb 4
  1495                                  
  1496 00004B58 <res 00000004>          dev_vendor:	resd 1
  1497 00004B5C <res 00000004>          bus_dev_fn:	resd 1
  1498 00004B60 <res 00000002>          ac97_io_base:	resw 1
  1499 00004B62 <res 00000001>          ac97_int_ln_reg: resb 1
  1500 00004B63 <res 00000001>          srb:		resb 1
  1501                                  
  1502 00004B64 <res 00000001>          flags:		resb 1
  1503                                  
  1504                                  ; 23/08/2020
  1505 00004B65 <res 00000001>          counter:	resb 1
  1506                                  
  1507 00004B66 <res 0000000A>          alignb 16
  1508                                  
  1509                                  ; PLAY.ASM
  1510                                  ;Scope:		resw 320
  1511 00004B70 <res 00000200>          RowOfs:		resw 256
  1512                                  
  1513                                  ; 23/10/2017
  1514 00004D70 <res 00000200>          NewScope_L:	resw 256
  1515 00004F70 <res 00000200>          NewScope_R:	resw 256
  1516 00005170 <res 00000200>          OldScope_L:	resw 256
  1517 00005370 <res 00000200>          OldScope_R:	resw 256
  1518                                  
  1519                                  ; 20/10/2017 (modplay7.s, SB16)
  1520                                  ; 19/10/2017 (modplay6.s, AC97)
  1521 00005570 <res 00000001>          pan_shift:	resb 1
  1522 00005571 <res 00000001>          volume_level:	resb 1
  1523                                  
  1524 00005572 <res 00000A8E>          alignb 4096
  1525                                  
  1526                                  audio_buffer:
  1527 00006000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1528                                  
  1529 0000E000 <res 00002000>          alignb 65536
  1530                                  
  1531                                  DMA_Buffer:
  1532 00010000 <res 00010000>          		resb 2*BUFFERSIZE  ; 65536 ; 09/10/2017 
  1533                                  file_buffer:
  1534 00020000 <res 00060000>          	resb 65536*6
  1535                                  EOF:
