     1                                  ; ****************************************************************************
     2                                  ; exectst2.s - TRDOS 386 (TRDOS v2.0) Kernel - 'sysexec' test
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 12/11/2017
     6                                  ;
     7                                  ; [ Last Modification: 19/11/2017 ]
     8                                  ;
     9                                  ; ****************************************************************************
    10                                  ; exectest.s (EXECTEST.PRG) - 19/11/2017  ('sysexec' test with 'sysfork')
    11                                  ; EXECTEST2.PRG : direct sysexec test (without 'sysfork')
    12                                  
    13                                  ; 20/08/2017
    14                                  ; 01/03/2017
    15                                  ; 16/10/2016
    16                                  ; 29/04/2016
    17                                  ; TRDOS 386 system calls (temporary list!)
    18                                  _ver 	equ 0
    19                                  _exit 	equ 1
    20                                  _fork 	equ 2
    21                                  _read 	equ 3
    22                                  _write	equ 4
    23                                  _open	equ 5
    24                                  _close 	equ 6
    25                                  _wait 	equ 7
    26                                  _creat 	equ 8
    27                                  _link 	equ 9
    28                                  _unlink	equ 10
    29                                  _exec	equ 11
    30                                  _chdir	equ 12
    31                                  _time 	equ 13
    32                                  _mkdir 	equ 14
    33                                  _chmod	equ 15
    34                                  _chown	equ 16
    35                                  _break	equ 17
    36                                  _stat	equ 18
    37                                  _seek	equ 19
    38                                  _tell 	equ 20
    39                                  _mount	equ 21
    40                                  _umount	equ 22
    41                                  _setuid	equ 23
    42                                  _getuid	equ 24
    43                                  _stime	equ 25
    44                                  _quit	equ 26	
    45                                  _intr	equ 27
    46                                  _fstat	equ 28
    47                                  _emt 	equ 29
    48                                  _mdate 	equ 30
    49                                  _video 	equ 31
    50                                  _audio	equ 32
    51                                  _timer	equ 33
    52                                  _sleep	equ 34
    53                                  _msg    equ 35
    54                                  _geterr	equ 36
    55                                  _fpsave	equ 37
    56                                  _pri	equ 38
    57                                  _rele	equ 39
    58                                  _fff	equ 40
    59                                  _fnf	equ 41
    60                                  _alloc	equ 42
    61                                  _dalloc equ 43
    62                                  _calbac equ 44
    63                                  _dma	equ 45	
    64                                  
    65                                  %macro sys 1-4
    66                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    67                                      ; 03/09/2015	
    68                                      ; 13/04/2015
    69                                      ; Retro UNIX 386 v1 system call.	
    70                                      %if %0 >= 2   
    71                                          mov ebx, %2
    72                                          %if %0 >= 3    
    73                                              mov ecx, %3
    74                                              %if %0 = 4
    75                                                 mov edx, %4   
    76                                              %endif
    77                                          %endif
    78                                      %endif
    79                                      mov eax, %1
    80                                      ;int 30h
    81                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    82                                  %endmacro
    83                                  
    84                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    85                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    86                                  
    87                                  ;========================================================================
    88                                  ; EXEC TEST - CODE
    89                                  ;========================================================================
    90                                  
    91                                  [BITS 32] ; 32-bit intructions
    92                                  
    93                                  [ORG 0] 
    94                                  
    95                                  START_CODE:
    96                                  	; clear bss
    97                                  	;mov	edi, bss_start ;
    98 00000000 66BF[A002]              	mov	di, bss_start
    99 00000004 B928000000              	mov	ecx, (bss_end - bss_start)/4
   100                                  	;xor	eax, eax
   101 00000009 F3AB                    	rep	stosd
   102                                  GetFileName:
   103 0000000B 89E6                    	mov	esi, esp
   104 0000000D AD                      	lodsd
   105 0000000E 83F802                  	cmp	eax, 2 ; two arguments 
   106                                  		; (program file name & mod file name)
   107 00000011 0F8238010000            	jb	pmsg_usage ; nothing to do
   108 00000017 7707                    	ja	short a_0
   109 00000019 C605[A5010000]00        	mov	byte [maxargslength], 0
   110                                  a_0:
   111                                  	; 18/11/2017
   112 00000020 48                      	dec	eax
   113 00000021 A2[A0020000]            	mov	[argc], al
   114                                  	;
   115 00000026 AD                      	lodsd ; name of this program
   116 00000027 AD                      	lodsd ; program file name address (to be launched)
   117 00000028 89F5                    	mov	ebp, esi ; 18/11/2017
   118 0000002A 89C6                    	mov	esi, eax
   119 0000002C BF[A3020000]            	mov	edi, prgfilename
   120                                  ScanName:       
   121 00000031 AC                      	lodsb
   122 00000032 3C20                    	cmp	al, 20h
   123 00000034 74FB                    	je	short ScanName	; scan start of name.
   124 00000036 0F8213010000            	jb	pmsg_usage
   125 0000003C AA                      	stosb
   126                                  a_1:
   127 0000003D FE0D[A4010000]          	dec	byte [maxfnlength]
   128 00000043 7408                    	jz	short a_2
   129 00000045 AC                      	lodsb
   130 00000046 3C20                    	cmp	al, 20h
   131 00000048 7603                    	jna	short a_2	
   132 0000004A AA                      	stosb
   133 0000004B EBF0                    	jmp	short a_1
   134                                  a_2:
   135                                  	;mov	ebx, edi 
   136                                  	;sub	ebx, prg_file_name ; file name length
   137                                  	;mov	[maxfnlength], bl
   138                                  
   139 0000004D BF[F3020000]            	mov	edi, arguments 
   140                                  	
   141                                  	; 18/11/2017
   142 00000052 FE0D[A0020000]          	dec	byte [argc]
   143 00000058 742F                    	jz	short a_4
   144                                  	;cmp	byte [maxargslength], 0
   145                                  	;jna	short a_4
   146 0000005A 8B7500                  	mov	esi, [ebp]
   147 0000005D 83C504                  	add	ebp, 4
   148                                  a_3:
   149 00000060 AC                      	lodsb
   150 00000061 3C20                    	cmp	al, 20h
   151                                  	;jna	short a_4
   152 00000063 7609                    	jna	short a_6 ; 18/11/2017
   153 00000065 AA                      	stosb
   154 00000066 FE0D[A5010000]          	dec	byte [maxargslength]
   155 0000006C 75F2                    	jnz	short a_3
   156                                  a_6:
   157                                  	; 18/11/2017
   158 0000006E FE0D[A0020000]          	dec	byte [argc]
   159 00000074 7413                    	jz	short a_4
   160 00000076 FE0D[A5010000]          	dec	byte [maxargslength]
   161 0000007C 740B                    	jz	short a_4
   162 0000007E B020                    	mov	al, 20h
   163 00000080 AA                      	stosb	
   164 00000081 8B7500                  	mov	esi, [ebp]
   165                                  	;and	esi, esi
   166                                  	;jz	short a_4
   167 00000084 83C504                  	add	ebp, 4
   168 00000087 EBD7                    	jmp	short a_3
   169                                  a_4:	
   170                                  	; 18/11/2017
   171 00000089 30C0                    	xor	al, al
   172 0000008B AA                      	stosb
   173                                  
   174                                  	;mov	ecx, edi
   175                                  	;sub	ecx, arguments ; arguments length
   176                                  	;mov	[maxargslength], cl
   177                                  
   178                                  	sys	_msg, msg_program1, 255, 0Bh
   178                              <1> 
   178                              <1> 
   178                              <1> 
   178                              <1> 
   178                              <1>  %if %0 >= 2
   178 0000008C BB[DA010000]        <1>  mov ebx, %2
   178                              <1>  %if %0 >= 3
   178 00000091 B9FF000000          <1>  mov ecx, %3
   178                              <1>  %if %0 = 4
   178 00000096 BA0B000000          <1>  mov edx, %4
   178                              <1>  %endif
   178                              <1>  %endif
   178                              <1>  %endif
   178 0000009B B823000000          <1>  mov eax, %1
   178                              <1> 
   178 000000A0 CD40                <1>  int 40h
   179                                  
   180                                  child_exec:
   181                                  	sys	_msg, msg_program2, 255, 0Ah
   181                              <1> 
   181                              <1> 
   181                              <1> 
   181                              <1> 
   181                              <1>  %if %0 >= 2
   181 000000A2 BB[2A020000]        <1>  mov ebx, %2
   181                              <1>  %if %0 >= 3
   181 000000A7 B9FF000000          <1>  mov ecx, %3
   181                              <1>  %if %0 = 4
   181 000000AC BA0A000000          <1>  mov edx, %4
   181                              <1>  %endif
   181                              <1>  %endif
   181                              <1>  %endif
   181 000000B1 B823000000          <1>  mov eax, %1
   181                              <1> 
   181 000000B6 CD40                <1>  int 40h
   182                                  	sys	_msg, prgfilename, 255, 0Ch
   182                              <1> 
   182                              <1> 
   182                              <1> 
   182                              <1> 
   182                              <1>  %if %0 >= 2
   182 000000B8 BB[A3020000]        <1>  mov ebx, %2
   182                              <1>  %if %0 >= 3
   182 000000BD B9FF000000          <1>  mov ecx, %3
   182                              <1>  %if %0 = 4
   182 000000C2 BA0C000000          <1>  mov edx, %4
   182                              <1>  %endif
   182                              <1>  %endif
   182                              <1>  %endif
   182 000000C7 B823000000          <1>  mov eax, %1
   182                              <1> 
   182 000000CC CD40                <1>  int 40h
   183                                  
   184 000000CE 803D[A5010000]00        	cmp	byte [maxargslength], 0
   185 000000D5 762C                    	jna	short a_5
   186                                  
   187                                  	sys	_msg, msg_program3, 255, 0Ah
   187                              <1> 
   187                              <1> 
   187                              <1> 
   187                              <1> 
   187                              <1>  %if %0 >= 2
   187 000000D7 BB[3B020000]        <1>  mov ebx, %2
   187                              <1>  %if %0 >= 3
   187 000000DC B9FF000000          <1>  mov ecx, %3
   187                              <1>  %if %0 = 4
   187 000000E1 BA0A000000          <1>  mov edx, %4
   187                              <1>  %endif
   187                              <1>  %endif
   187                              <1>  %endif
   187 000000E6 B823000000          <1>  mov eax, %1
   187                              <1> 
   187 000000EB CD40                <1>  int 40h
   188                                  	sys	_msg, arguments, 255, 0Ch
   188                              <1> 
   188                              <1> 
   188                              <1> 
   188                              <1> 
   188                              <1>  %if %0 >= 2
   188 000000ED BB[F3020000]        <1>  mov ebx, %2
   188                              <1>  %if %0 >= 3
   188 000000F2 B9FF000000          <1>  mov ecx, %3
   188                              <1>  %if %0 = 4
   188 000000F7 BA0C000000          <1>  mov edx, %4
   188                              <1>  %endif
   188                              <1>  %endif
   188                              <1>  %endif
   188 000000FC B823000000          <1>  mov eax, %1
   188                              <1> 
   188 00000101 CD40                <1>  int 40h
   189                                  a_5:	
   190                                  	sys	_msg, msg_program4, 255, 0Fh
   190                              <1> 
   190                              <1> 
   190                              <1> 
   190                              <1> 
   190                              <1>  %if %0 >= 2
   190 00000103 BB[4C020000]        <1>  mov ebx, %2
   190                              <1>  %if %0 >= 3
   190 00000108 B9FF000000          <1>  mov ecx, %3
   190                              <1>  %if %0 = 4
   190 0000010D BA0F000000          <1>  mov edx, %4
   190                              <1>  %endif
   190                              <1>  %endif
   190                              <1>  %endif
   190 00000112 B823000000          <1>  mov eax, %1
   190                              <1> 
   190 00000117 CD40                <1>  int 40h
   191                                  	
   192 00000119 30E4                    	xor	ah, ah
   193 0000011B CD32                    	int	32h
   194                                  
   195 0000011D 3C1B                    	cmp	al, 1Bh ; ESC key
   196 0000011F 745C                    	je	short child_cancel
   197                                  
   198                                  	sys	_exec, prgfilename, prgp 
   198                              <1> 
   198                              <1> 
   198                              <1> 
   198                              <1> 
   198                              <1>  %if %0 >= 2
   198 00000121 BB[A3020000]        <1>  mov ebx, %2
   198                              <1>  %if %0 >= 3
   198 00000126 B9[98010000]        <1>  mov ecx, %3
   198                              <1>  %if %0 = 4
   198                              <1>  mov edx, %4
   198                              <1>  %endif
   198                              <1>  %endif
   198                              <1>  %endif
   198 0000012B B80B000000          <1>  mov eax, %1
   198                              <1> 
   198 00000130 CD40                <1>  int 40h
   199                                  
   200                                  	sys	_msg, error_msg, 255, 0Eh
   200                              <1> 
   200                              <1> 
   200                              <1> 
   200                              <1> 
   200                              <1>  %if %0 >= 2
   200 00000132 BB[88020000]        <1>  mov ebx, %2
   200                              <1>  %if %0 >= 3
   200 00000137 B9FF000000          <1>  mov ecx, %3
   200                              <1>  %if %0 = 4
   200 0000013C BA0E000000          <1>  mov edx, %4
   200                              <1>  %endif
   200                              <1>  %endif
   200                              <1>  %endif
   200 00000141 B823000000          <1>  mov eax, %1
   200                              <1> 
   200 00000146 CD40                <1>  int 40h
   201                                  
   202                                  terminate:
   203                                  	sys	_exit
   203                              <1> 
   203                              <1> 
   203                              <1> 
   203                              <1> 
   203                              <1>  %if %0 >= 2
   203                              <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 00000148 B801000000          <1>  mov eax, %1
   203                              <1> 
   203 0000014D CD40                <1>  int 40h
   204                                  
   205                                  pmsg_usage:      
   206                                  	sys	_msg, msg_program1, 255, 0Ah
   206                              <1> 
   206                              <1> 
   206                              <1> 
   206                              <1> 
   206                              <1>  %if %0 >= 2
   206 0000014F BB[DA010000]        <1>  mov ebx, %2
   206                              <1>  %if %0 >= 3
   206 00000154 B9FF000000          <1>  mov ecx, %3
   206                              <1>  %if %0 = 4
   206 00000159 BA0A000000          <1>  mov edx, %4
   206                              <1>  %endif
   206                              <1>  %endif
   206                              <1>  %endif
   206 0000015E B823000000          <1>  mov eax, %1
   206                              <1> 
   206 00000163 CD40                <1>  int 40h
   207                                  	sys	_msg, msg_usage, 255, 0Fh
   207                              <1> 
   207                              <1> 
   207                              <1> 
   207                              <1> 
   207                              <1>  %if %0 >= 2
   207 00000165 BB[A6010000]        <1>  mov ebx, %2
   207                              <1>  %if %0 >= 3
   207 0000016A B9FF000000          <1>  mov ecx, %3
   207                              <1>  %if %0 = 4
   207 0000016F BA0F000000          <1>  mov edx, %4
   207                              <1>  %endif
   207                              <1>  %endif
   207                              <1>  %endif
   207 00000174 B823000000          <1>  mov eax, %1
   207                              <1> 
   207 00000179 CD40                <1>  int 40h
   208                                  	
   209 0000017B EBCB                    	jmp	short terminate
   210                                  
   211                                  child_cancel:
   212                                  	sys	_msg, msg_program6, 255, 0Eh
   212                              <1> 
   212                              <1> 
   212                              <1> 
   212                              <1> 
   212                              <1>  %if %0 >= 2
   212 0000017D BB[7C020000]        <1>  mov ebx, %2
   212                              <1>  %if %0 >= 3
   212 00000182 B9FF000000          <1>  mov ecx, %3
   212                              <1>  %if %0 = 4
   212 00000187 BA0E000000          <1>  mov edx, %4
   212                              <1>  %endif
   212                              <1>  %endif
   212                              <1>  %endif
   212 0000018C B823000000          <1>  mov eax, %1
   212                              <1> 
   212 00000191 CD40                <1>  int 40h
   213 00000193 EBB3                    	jmp	short terminate
   214                                  
   215 00000195 90<rept>                align 4
   216 00000198 [A3020000]              prgp:	dd prgfilename
   217 0000019C [F3020000]              	dd arguments
   218 000001A0 00000000                	dd 0
   219                                  
   220 000001A4 4F                      maxfnlength:	db 79
   221 000001A5 4F                      maxargslength:	db 79				
   222                                  
   223                                  ;-----------------------------------------------------------------
   224                                  ;  messages
   225                                  ;-----------------------------------------------------------------
   226                                  
   227                                  msg_usage:
   228 000001A6 0D0A                    	db 0Dh, 0Ah
   229 000001A8 55736167653A206578-     	db 'Usage: exectest <program file name> <arguments>'
   229 000001B1 656374657374203C70-
   229 000001BA 726F6772616D206669-
   229 000001C3 6C65206E616D653E20-
   229 000001CC 3C617267756D656E74-
   229 000001D5 733E               
   230 000001D7 0D0A00                  	db 0Dh, 0Ah, 0
   231                                  
   232                                  msg_program1:
   233 000001DA 45584543544553542E-     	db "EXECTEST.PRG /// TRDOS 386 'sysexec' test program"
   233 000001E3 505247202F2F2F2054-
   233 000001EC 52444F532033383620-
   233 000001F5 277379736578656327-
   233 000001FE 20746573742070726F-
   233 00000207 6772616D           
   234 0000020B 0D0A                    	db 0Dh, 0Ah
   235 0000020D 6279204572646F6761-     	db "by Erdogan Tan, 19/11/2017", 0Dh, 0Ah, 0
   235 00000216 6E2054616E2C203139-
   235 0000021F 2F31312F323031370D-
   235 00000228 0A00               
   236                                  msg_program2:
   237 0000022A 0D0A                    	db 0Dh, 0Ah
   238 0000022C 50524F4752414D204E-     	db "PROGRAM NAME: ", 0
   238 00000235 414D453A2000       
   239                                  msg_program3:
   240 0000023B 0D0A                    	db 0Dh, 0Ah
   241 0000023D 417267756D656E7428-     	db "Argument(s) : ", 0		
   241 00000246 7329203A2000       
   242                                  msg_program4:
   243 0000024C 0D0A                    	db 0Dh, 0Ah
   244 0000024E 507265737320616E79-     	db "Press any key to run the program..."
   244 00000257 206B657920746F2072-
   244 00000260 756E20746865207072-
   244 00000269 6F6772616D2E2E2E   
   245 00000271 0D0A00                  	db 0Dh, 0Ah, 0
   246                                  msg_program5:
   247 00000274 0D0A                    	db 0Dh, 0Ah
   248 00000276 4F4B2E                  	db "OK."
   249 00000279 0D0A00                  	db 0Dh, 0Ah, 0
   250                                  
   251                                  msg_program6:
   252 0000027C 0D0A                    	db 0Dh, 0Ah
   253 0000027E 43414E43454C2E          	db "CANCEL."
   254 00000285 0D0A00                  	db 0Dh, 0Ah, 0
   255                                  
   256                                  error_msg:
   257 00000288 0D0A07                  	db 0Dh, 0Ah, 07h
   258 0000028B 277379736578656327-     	db "'sysexec' error ! "
   258 00000294 206572726F72202120 
   259 0000029D 0D0A                    	db 0Dh, 0Ah
   260 0000029F 00                      	db 0
   261                                  
   262                                  bss_start:
   263                                  
   264                                  alignb 4  ; 19/11/2017
   265                                  
   266                                  ABSOLUTE bss_start
   267                                  
   268                                  ;========================================================================
   269                                  ; UNINITIALIZED DATA
   270                                  ;========================================================================
   271                                  
   272                                  argc:	resb 0 ; 18/11/2017
   273                                  
   274 000002A0 <res 00000003>          	resb 3 ; 19/11/2017
   275                                  
   276                                  ;alignb 4
   277                                  
   278 000002A3 <res 00000050>          prgfilename:  resb 80
   279 000002F3 <res 00000050>          arguments:    resb 80
   280                                  
   281                                  ;alignb4
   282                                  
   283                                  bss_end:
