     1                                  ; ****************************************************************************
     2                                  ; exectst3.s - TRDOS 386 (TRDOS v2.0) Kernel - 'sysexec' and 'sysfork' test
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 24/01/2021
     6                                  ;
     7                                  ; ****************************************************************************
     8                                  ; nasm exectst3.s -l exectst3.txt -o EXECTST3.PRG -Z error.txt
     9                                  
    10                                  ; exectest.s (EXECTEST.PRG) - 19/11/2017 ('sysexec' test with 'sysfork')
    11                                  ; exectst2.s (EXECTST2.PRG) - 12/11/2017 ('sysexec' test without 'sysfork')
    12                                  ; exectst3.s (EXECTST3.PRG) - 24/01/2021 ('sysexec' test with 'sysfork')
    13                                  
    14                                  ; 14/07/2020
    15                                  ; 31/12/2017
    16                                  ; TRDOS 386 (v2.0) system calls
    17                                  _ver 	equ 0
    18                                  _exit 	equ 1
    19                                  _fork 	equ 2
    20                                  _read 	equ 3
    21                                  _write	equ 4
    22                                  _open	equ 5
    23                                  _close 	equ 6
    24                                  _wait 	equ 7
    25                                  _create	equ 8
    26                                  _rename	equ 9
    27                                  _delete	equ 10
    28                                  _exec	equ 11
    29                                  _chdir	equ 12
    30                                  _time 	equ 13
    31                                  _mkdir 	equ 14
    32                                  _chmod	equ 15
    33                                  _rmdir	equ 16
    34                                  _break	equ 17
    35                                  _drive	equ 18
    36                                  _seek	equ 19
    37                                  _tell 	equ 20
    38                                  _memory	equ 21
    39                                  _prompt	equ 22
    40                                  _path	equ 23
    41                                  _env	equ 24
    42                                  _stime	equ 25
    43                                  _quit	equ 26	
    44                                  _intr	equ 27
    45                                  _dir	equ 28
    46                                  _emt 	equ 29
    47                                  _ldrvt 	equ 30
    48                                  _video 	equ 31
    49                                  _audio	equ 32
    50                                  _timer	equ 33
    51                                  _sleep	equ 34
    52                                  _msg    equ 35
    53                                  _geterr	equ 36
    54                                  _fpstat	equ 37
    55                                  _pri	equ 38
    56                                  _rele	equ 39
    57                                  _fff	equ 40
    58                                  _fnf	equ 41
    59                                  _alloc	equ 42
    60                                  _dalloc equ 43
    61                                  _calbac equ 44
    62                                  _dma	equ 45	
    63                                  
    64                                  %macro sys 1-4
    65                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    66                                      ; 03/09/2015	
    67                                      ; 13/04/2015
    68                                      ; Retro UNIX 386 v1 system call.		
    69                                      %if %0 >= 2   
    70                                          mov ebx, %2
    71                                          %if %0 >= 3    
    72                                              mov ecx, %3
    73                                              %if %0 = 4
    74                                                 mov edx, %4   
    75                                              %endif
    76                                          %endif
    77                                      %endif
    78                                      mov eax, %1
    79                                      ;int 30h
    80                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    81                                  %endmacro
    82                                  
    83                                  ; Retro UNIX 386 v1 system call format:
    84                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    85                                  
    86                                  [BITS 32] ; We need 32-bit intructions for protected mode
    87                                  
    88                                  [ORG 0] 
    89                                  
    90                                  START_CODE:
    91                                  	; clear bss
    92 00000000 BF[9C020000]            	mov	edi, bss_start
    93 00000005 B921000000              	mov	ecx, (bss_end - bss_start)/4
    94                                  	;xor	eax, eax
    95 0000000A F3AB                    	rep	stosd
    96                                  
    97                                  	; program message
    98 0000000C BE[A5010000]            	mov	esi, program_msg
    99 00000011 E8D9000000              	call	print_msg
   100                                  
   101 00000016 E896000000              	call	file_name_input
   102 0000001B 7262                    	jc	short terminate
   103                                  
   104                                  	; EBX = EAX = file name or path address
   105                                  	; CL = file attributes (archive = 20h, read only = 01h)
   106                                  	;	(21h = Archived & Read Only files are included)
   107                                  	; CH = 0 = basic parameters (24 bytes)
   108                                  	; EDX = DTA = buffer address (24 bytes for basic parameters)
   109                                  	; EAX = _fff = 'Find First File' system call for TRDOS 386
   110                                  
   111                                  	; Find First File
   112                                  	sys	_fff, prg_file_name, 0021h, DTA
   112                              <1> 
   112                              <1> 
   112                              <1> 
   112                              <1> 
   112                              <1>  %if %0 >= 2
   112 0000001D BB[C0020000]        <1>  mov ebx, %2
   112                              <1>  %if %0 >= 3
   112 00000022 B921000000          <1>  mov ecx, %3
   112                              <1>  %if %0 = 4
   112 00000027 BA[9C020000]        <1>  mov edx, %4
   112                              <1>  %endif
   112                              <1>  %endif
   112                              <1>  %endif
   112 0000002C B828000000          <1>  mov eax, %1
   112                              <1> 
   112 00000031 CD40                <1>  int 40h
   113 00000033 730C                    	jnc	short _2
   114                                  _1:
   115 00000035 BE[29020000]            	mov	esi, not_found_msg
   116 0000003A E8B0000000              	call	print_msg
   117                                  
   118 0000003F EB3E                    	jmp	short terminate
   119                                  _2:
   120                                  	; check file attributes
   121 00000041 F605[9C020000]1E        	test	byte [DTA], 1Eh ; 10h = directory, 08h = volume label
   122                                  				; 04h = system, 02h = hidden
   123 00000048 75EB                    	jnz	short _1   ; attributes are not proper
   124                                  
   125                                  	; atributes are proper 
   126 0000004A BE[45020000]            	mov	esi, press_any_key_msg
   127 0000004F E89B000000              	call	print_msg
   128                                  
   129 00000054 30E4                    	xor	ah, ah
   130 00000056 CD32                    	int	32h
   131                                  
   132 00000058 BE[73020000]            	mov	esi, nextline
   133 0000005D E88D000000              	call	print_msg
   134                                  
   135 00000062 BB[88000000]            	mov	ebx, child_exec
   136                                  	sys	_fork
   136                              <1> 
   136                              <1> 
   136                              <1> 
   136                              <1> 
   136                              <1>  %if %0 >= 2
   136                              <1>  mov ebx, %2
   136                              <1>  %if %0 >= 3
   136                              <1>  mov ecx, %3
   136                              <1>  %if %0 = 4
   136                              <1>  mov edx, %4
   136                              <1>  %endif
   136                              <1>  %endif
   136                              <1>  %endif
   136 00000067 B802000000          <1>  mov eax, %1
   136                              <1> 
   136 0000006C CD40                <1>  int 40h
   137                                  
   138                                  	sys	_wait
   138                              <1> 
   138                              <1> 
   138                              <1> 
   138                              <1> 
   138                              <1>  %if %0 >= 2
   138                              <1>  mov ebx, %2
   138                              <1>  %if %0 >= 3
   138                              <1>  mov ecx, %3
   138                              <1>  %if %0 = 4
   138                              <1>  mov edx, %4
   138                              <1>  %endif
   138                              <1>  %endif
   138                              <1>  %endif
   138 0000006E B807000000          <1>  mov eax, %1
   138                              <1> 
   138 00000073 CD40                <1>  int 40h
   139                                  
   140                                  parent_return:
   141 00000075 BE[0D020000]            	mov	esi, msg_ok
   142 0000007A E870000000              	call	print_msg
   143                                  terminate:
   144                                  	sys	_exit
   144                              <1> 
   144                              <1> 
   144                              <1> 
   144                              <1> 
   144                              <1>  %if %0 >= 2
   144                              <1>  mov ebx, %2
   144                              <1>  %if %0 >= 3
   144                              <1>  mov ecx, %3
   144                              <1>  %if %0 = 4
   144                              <1>  mov edx, %4
   144                              <1>  %endif
   144                              <1>  %endif
   144                              <1>  %endif
   144 0000007F B801000000          <1>  mov eax, %1
   144                              <1> 
   144 00000084 CD40                <1>  int 40h
   145                                  halt:
   146 00000086 EBFE                    	jmp	short halt
   147                                  
   148                                  child_exec:
   149                                  	; execute (run) program
   150                                  	sys	_exec, prg_file_name, prgp 
   150                              <1> 
   150                              <1> 
   150                              <1> 
   150                              <1> 
   150                              <1>  %if %0 >= 2
   150 00000088 BB[C0020000]        <1>  mov ebx, %2
   150                              <1>  %if %0 >= 3
   150 0000008D B9[8D020000]        <1>  mov ecx, %3
   150                              <1>  %if %0 = 4
   150                              <1>  mov edx, %4
   150                              <1>  %endif
   150                              <1>  %endif
   150                              <1>  %endif
   150 00000092 B80B000000          <1>  mov eax, %1
   150                              <1> 
   150 00000097 CD40                <1>  int 40h
   151                                  
   152                                  	; Error if child returns here
   153                                  
   154                                  	sys	_msg, error_msg, 255, 0Eh
   154                              <1> 
   154                              <1> 
   154                              <1> 
   154                              <1> 
   154                              <1>  %if %0 >= 2
   154 00000099 BB[76020000]        <1>  mov ebx, %2
   154                              <1>  %if %0 >= 3
   154 0000009E B9FF000000          <1>  mov ecx, %3
   154                              <1>  %if %0 = 4
   154 000000A3 BA0E000000          <1>  mov edx, %4
   154                              <1>  %endif
   154                              <1>  %endif
   154                              <1>  %endif
   154 000000A8 B823000000          <1>  mov eax, %1
   154                              <1> 
   154 000000AD CD40                <1>  int 40h
   155 000000AF EBCE                    	jmp	short terminate
   156                                  
   157                                  file_name_input:
   158                                  	; subroutine for entering file name to run
   159                                  
   160 000000B1 BE[FA010000]            	mov	esi, prg_file_name_msg
   161 000000B6 E834000000              	call	print_msg
   162 000000BB E840000000              	call	rw_char
   163 000000C0 7214                    	jc	short fni_1
   164 000000C2 BF[C0020000]            	mov	edi, prg_file_name
   165 000000C7 803E20                  	cmp	byte [esi], 20h
   166 000000CA 760A                    	jna	short short fni_1
   167 000000CC B90C000000              	mov	ecx, 12
   168                                  fni_0:
   169 000000D1 AC                      	lodsb
   170 000000D2 3C20                    	cmp	al, 20h
   171 000000D4 7306                    	jnb	short fni_2
   172                                  fni_1:
   173                                  	;mov	[edi], 0
   174                                  	;inc	edi
   175                                  	;loop	fni_1
   176                                  	;jmp 	short fni_3 ; find_file
   177                                  
   178 000000D6 28C0                    	sub	al, al ; 0
   179 000000D8 F3AA                    	rep	stosb
   180 000000DA EB05                    	jmp 	short fni_3 ; find_file
   181                                  fni_2:
   182 000000DC 8807                    	mov	byte [edi], al
   183 000000DE 47                      	inc	edi
   184 000000DF E2F0                    	loop	fni_0
   185                                  fni_3:
   186 000000E1 803D[C0020000]21        	cmp	byte [prg_file_name], 21h
   187 000000E8 7215                    	jb	short fni_4 ; cf = 1
   188                                  	
   189                                  	; next line
   190 000000EA BE[73020000]            	mov	esi, nextline
   191                                  print_msg:
   192 000000EF B40E                    	mov	ah, 0Eh
   193 000000F1 BB07000000              	mov	ebx, 7
   194                                  	;mov	bl, 7 ; char attribute & color
   195                                  p_next_chr:
   196 000000F6 AC                      	lodsb
   197 000000F7 08C0                    	or	al, al
   198 000000F9 7404                    	jz	short fni_4 ; retn	
   199 000000FB CD31                    	int	31h
   200 000000FD EBF7                    	jmp	short p_next_chr
   201                                  fni_4:
   202 000000FF C3                      	retn
   203                                  
   204                                  rw_char:
   205                                  	; file name (text) input routine
   206                                  	; OUTPUT -> esi = Entered String (ASCIIZ)
   207 00000100 BE[C0020000]            	mov	esi, prg_file_name
   208 00000105 BB07000000              	mov	ebx, 7
   209 0000010A B403                    	mov	ah, 3
   210                                  	;int	10h
   211 0000010C CD31                    	int	31h
   212 0000010E 668915[CE020000]        	mov	[cursor_pos], dx
   213 00000115 EB0A                    	jmp	short read_next_char
   214                                  loc_arrow:    
   215 00000117 80FC4B                  	cmp     ah, 4Bh
   216 0000011A 7415                    	je      short loc_back
   217 0000011C 80FC53                  	cmp     ah, 53h
   218 0000011F 7410                    	je      short loc_back
   219                                  read_next_char:
   220 00000121 30E4                    	xor	ah, ah
   221                                  	;int	16h
   222 00000123 CD32                    	int	32h
   223 00000125 20C0                    	and	al, al
   224 00000127 74EE                    	jz	short loc_arrow    
   225 00000129 3CE0                    	cmp	al, 0E0h          
   226 0000012B 74EA                    	je	short loc_arrow
   227 0000012D 3C08                    	cmp	al, 08h
   228 0000012F 753C                    	jne	short char_return
   229                                  loc_back:
   230 00000131 B307                    	mov	bl, 7
   231 00000133 B403                    	mov	ah, 3
   232                                  	;int	10h
   233 00000135 CD31                    	int	31h
   234 00000137 3A15[CE020000]          	cmp	dl, [cursor_pos]
   235 0000013D 7708                    	ja	short prev_column
   236                                  loc_beep:
   237 0000013F B40E                    	mov	ah, 0Eh
   238 00000141 B007                    	mov	al, 7
   239                                  	;int	10h
   240 00000143 CD31                    	int	31h
   241 00000145 EBDA                    	jmp	short read_next_char
   242                                  prev_column:
   243 00000147 FECA                    	dec	dl
   244                                  set_cursor_pos:
   245 00000149 B402                    	mov	ah, 02h
   246                                  	;int	10h
   247 0000014B CD31                    	int	31h
   248 0000014D 88D3                    	mov	bl, dl
   249 0000014F 2A1D[CE020000]          	sub	bl, [cursor_pos] 
   250 00000155 66B90100                	mov	cx, 1
   251 00000159 B409                    	mov	ah, 09h
   252 0000015B B020                    	mov	al, 20h
   253 0000015D 88041E                  	mov	[esi+ebx], al
   254                                  loc_write_it:
   255 00000160 B307                    	mov	bl, 7
   256                                  	;int	10h
   257 00000162 CD31                    	int	31h
   258 00000164 668B15[CE020000]        	mov	dx, [cursor_pos]
   259 0000016B EBB4                    	jmp	short read_next_char
   260                                  ;loc_arrow:    
   261                                  ;	cmp     ah, 4Bh
   262                                  ;	je      short loc_back
   263                                  ;	cmp     AH, 53h
   264                                  ;	je      short loc_back
   265                                  ;	jmp	short read_next_char
   266                                  char_return:
   267 0000016D B307                    	mov	bl, 7
   268 0000016F B403                    	mov	ah, 3
   269                                  	;int	10h
   270 00000171 CD31                    	int	31h
   271 00000173 88D3                    	mov	bl, dl
   272 00000175 2A1D[CE020000]          	sub	bl, [cursor_pos] 
   273 0000017B 3C20                    	cmp	al, 20h
   274 0000017D 7220                    	jb	short loc_escape
   275 0000017F 80FB3F                  	cmp	bl, 63
   276 00000182 77BB                    	ja	short loc_beep
   277                                  	;cmp	al, "z"
   278                                  	;ja	short read_next_char
   279                                  	;cmp	al, "a"
   280                                  	;jb	short pass_capitalize
   281                                  	;and	al, 0DFh
   282                                  pass_capitalize:
   283 00000184 30E4                    	xor	ah, ah
   284 00000186 6689041E                	mov	[esi+ebx], ax
   285 0000018A B40E                    	mov	ah, 0Eh
   286 0000018C B307                    	mov	bl, 7
   287                                  	;int	10h
   288 0000018E CD31                    	int	31h
   289 00000190 EB8F                    	jmp	short read_next_char
   290                                  pass_escape:
   291 00000192 3C0D                    	cmp	al, 0Dh
   292 00000194 758B                    	jne	short read_next_char
   293 00000196 B307                    	mov	bl, 7
   294                                  	;int	10h
   295 00000198 CD31                    	int	31h
   296 0000019A B00A                    	mov	al, 0Ah
   297                                  	;int	10h
   298 0000019C CD31                    	int	31h
   299 0000019E C3                      	retn
   300                                  loc_escape:
   301 0000019F 3C1B                    	cmp	al, 1Bh
   302 000001A1 75EF                    	jne	short pass_escape
   303 000001A3 F9                      	stc
   304 000001A4 C3                      	retn
   305                                  		
   306                                  program_msg:
   307 000001A5 0D0A                    	db 0Dh, 0Ah
   308 000001A7 5452444F5320333836-     	db "TRDOS 386 v2.0 - 'sysexec' & 'sysfork' Test Program"
   308 000001B0 2076322E30202D2027-
   308 000001B9 737973657865632720-
   308 000001C2 262027737973666F72-
   308 000001CB 6B2720546573742050-
   308 000001D4 726F6772616D       
   309 000001DA 0D0A                    	db 0Dh, 0Ah
   310 000001DC 6279204572646F6761-     	db "by Erdogan Tan - 24/01/2021"
   310 000001E5 6E2054616E202D2032-
   310 000001EE 342F30312F32303231 
   311 000001F7 0D0A00                  	db 0Dh, 0Ah, 0
   312                                  prg_file_name_msg:
   313 000001FA 0D0A                    	db 0Dh, 0Ah
   314 000001FC 5052472046696C6520-     	db "PRG File Name : ", 0
   314 00000205 4E616D65203A2000   
   315                                  msg_ok:
   316                                  	;db 0Dh, 0Ah
   317 0000020D 2852657475726E2074-     	db "(Return to parent is) OK."
   317 00000216 6F20706172656E7420-
   317 0000021F 697329204F4B2E     
   318 00000226 0D0A00                  	db 0Dh, 0Ah, 0
   319                                  not_found_msg:
   320 00000229 0D0A                    	db 0Dh, 0Ah
   321 0000022B 50726F6772616D2066-     	db "Program file not found!"
   321 00000234 696C65206E6F742066-
   321 0000023D 6F756E6421         
   322 00000242 0D0A00                  	db 0Dh, 0Ah, 0	
   323                                  press_any_key_msg:
   324 00000245 0D0A                    	db 0Dh, 0Ah
   325 00000247 507265737320616E79-     	db "Press any key to run (child) program file .."
   325 00000250 206B657920746F2072-
   325 00000259 756E20286368696C64-
   325 00000262 292070726F6772616D-
   325 0000026B 2066696C65202E2E   
   326                                  nextline:
   327 00000273 0D0A00                  	db 0Dh, 0Ah, 0	
   328                                  error_msg:
   329 00000276 0D0A07                  	db 0Dh, 0Ah, 07h
   330 00000279 277379736578656327-     	db "'sysexec' error !"
   330 00000282 206572726F722021   
   331 0000028A 0D0A                    	db 0Dh, 0Ah
   332 0000028C 00                      	db 0
   333                                  
   334 0000028D [C0020000]              prgp:	dd prg_file_name
   335 00000291 [D0020000]              	dd arguments
   336 00000295 00000000                	dd 0
   337                                  
   338                                  bss:
   339                                  
   340                                  ABSOLUTE bss
   341                                  
   342 00000299 <res 00000003>          alignb 4
   343                                  
   344                                  bss_start:
   345                                  
   346 0000029C <res 00000018>          DTA:	resb 24
   347                                  
   348 000002B4 <res 0000000C>          alignb 16
   349                                  
   350                                  prg_file_name: 
   351 000002C0 <res 0000000D>          	resb 13
   352 000002CD <res 00000001>          	resb 1
   353                                  
   354                                  cursor_pos:
   355 000002CE <res 00000002>          	resw 1
   356                                  
   357                                  arguments:
   358 000002D0 <res 00000050>          	resb 80
   359                                  
   360                                  bss_end:
