     1                                  ; ****************************************************************************
     2                                  ; exittst2.s - TRDOS 386 (TRDOS v2.0) Kernel - 'sysexit' exit code test 
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 20/08/2024
     6                                  ;
     7                                  ; [ Last Modification: 20/08/2024 ]
     8                                  ;
     9                                  ; Modified from 'TRDOS 386 v2' EXIT TEST source code by Erdogan Tan
    10                                  ; ('exittest.s', 20/08/2024)
    11                                  ;
    12                                  ; ****************************************************************************
    13                                  
    14                                  ; 20/08/2024 ; TRDOS 386 v2.0.9 (exit code)
    15                                  ; 20/08/2017
    16                                  ; 01/03/2017
    17                                  ; 16/10/2016
    18                                  ; 29/04/2016
    19                                  ; TRDOS 386 system calls (temporary list!)
    20                                  _ver 	equ 0
    21                                  _exit 	equ 1
    22                                  _fork 	equ 2
    23                                  _read 	equ 3
    24                                  _write	equ 4
    25                                  _open	equ 5
    26                                  _close 	equ 6
    27                                  _wait 	equ 7
    28                                  _creat 	equ 8
    29                                  _link 	equ 9
    30                                  _unlink	equ 10
    31                                  _exec	equ 11
    32                                  _chdir	equ 12
    33                                  _time 	equ 13
    34                                  _mkdir 	equ 14
    35                                  _chmod	equ 15
    36                                  _chown	equ 16
    37                                  _break	equ 17
    38                                  _stat	equ 18
    39                                  _seek	equ 19
    40                                  _tell 	equ 20
    41                                  _mount	equ 21
    42                                  _umount	equ 22
    43                                  _setuid	equ 23
    44                                  _getuid	equ 24
    45                                  _stime	equ 25
    46                                  _quit	equ 26	
    47                                  _intr	equ 27
    48                                  _fstat	equ 28
    49                                  _emt 	equ 29
    50                                  _mdate 	equ 30
    51                                  _video 	equ 31
    52                                  _audio	equ 32
    53                                  _timer	equ 33
    54                                  _sleep	equ 34
    55                                  _msg    equ 35
    56                                  _geterr	equ 36
    57                                  _fpsave	equ 37
    58                                  _pri	equ 38
    59                                  _rele	equ 39
    60                                  _fff	equ 40
    61                                  _fnf	equ 41
    62                                  _alloc	equ 42
    63                                  _dalloc equ 43
    64                                  _calbac equ 44
    65                                  _dma	equ 45
    66                                  _stdio  equ 46	;  TRDOS 386 v2.0.9
    67                                  
    68                                  %macro sys 1-4
    69                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    70                                      ; 03/09/2015	
    71                                      ; 13/04/2015
    72                                      ; Retro UNIX 386 v1 system call.	
    73                                      %if %0 >= 2   
    74                                          mov ebx, %2
    75                                          %if %0 >= 3    
    76                                              mov ecx, %3
    77                                              %if %0 = 4
    78                                                 mov edx, %4   
    79                                              %endif
    80                                          %endif
    81                                      %endif
    82                                      mov eax, %1
    83                                      ;int 30h
    84                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    85                                  %endmacro
    86                                  
    87                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    88                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    89                                  
    90                                  ;========================================================================
    91                                  ; EXIT TEST - CODE
    92                                  ;========================================================================
    93                                  
    94                                  [BITS 32] ; 32-bit intructions
    95                                  
    96                                  [ORG 0] 
    97                                  START_CODE:
    98 00000000 C605[7C010000]0C        	mov	byte [color], 0Ch
    99 00000007 BE[BF010000]            	mov 	esi, sysexit_test
   100 0000000C E83E010000              	call 	print_msg
   101                                  
   102 00000011 BB[DD000000]                  	mov 	ebx, chldr
   103                                  	sys 	_fork
    69                              <1> 
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000016 B802000000          <1>  mov eax, %1
    83                              <1> 
    84 0000001B CD40                <1>  int 40h
   104 0000001D 7225                    	jc 	short error
   105                                  
   106 0000001F A3[BB010000]            	mov	[cpid], eax ; child's process ID
   107                                  
   108 00000024 E83B010000              	call 	bin_to_decimal_str
   109 00000029 891D[0B020000]          	mov 	[pprocessid], ebx
   110                                  
   111 0000002F C605[7C010000]07        	mov	byte [color], 07h
   112                                  pwait:
   113 00000036 BBE7030000              	mov	ebx, 999 ; this must not return
   114                                  	sys 	_wait
    69                              <1> 
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000003B B807000000          <1>  mov eax, %1
    83                              <1> 
    84 00000040 CD40                <1>  int 40h
   115                                  	;jc 	short error
   116 00000042 7311                    	jnc	short pwait_ok
   117                                  
   118                                  error:
   119 00000044 BE[47020000]            	mov 	esi, msg_err
   120 00000049 E801010000              	call 	print_msg
   121                                   	;jmp 	short here
   122                                  here:	
   123                                  	sys	_exit
    69                              <1> 
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000004E B801000000          <1>  mov eax, %1
    83                              <1> 
    84 00000053 CD40                <1>  int 40h
   124                                  	; hlt
   125                                  	; jmp 	short here
   126                                  
   127                                  pwait_ok:
   128 00000055 3B05[BB010000]          	cmp 	eax, [cpid]
   129 0000005B 75D9                    	jne 	short pwait	
   130                                  
   131                                  	; EAX = child's process id (AX)
   132                                  	; EBX = child's exit code (BL) ; must be 209
   133                                  
   134 0000005D 53                      	push	ebx  ; exit code
   135                                  
   136 0000005E E801010000              	call 	bin_to_decimal_str
   137 00000063 891D[26020000]          	mov 	[cprocessid], ebx
   138                                  
   139 00000069 C605[7C010000]0A        	mov	byte [color], 0Ah
   140 00000070 BE[80010000]            	mov	esi, child_name
   141 00000075 E8D5000000              	call	print_msg
   142 0000007A C605[7C010000]0E        	mov	byte [color], 0Eh
   143 00000081 BE[93010000]            	mov	esi, prgfilename
   144 00000086 E8C4000000              	call	print_msg	
   145                                  
   146 0000008B C605[7C010000]07        	mov	byte [color], 07h
   147 00000092 BE[5A020000]            	mov	esi, CRLF
   148 00000097 E8B3000000              	call	print_msg
   149                                  
   150 0000009C C605[7C010000]0F        	mov	byte [color], 0Fh
   151 000000A3 BE[12020000]            	mov 	esi, child_pid
   152 000000A8 E8A2000000              	call 	print_msg
   153                                  
   154 000000AD 58                      	pop	eax
   155                                  
   156 000000AE E8B1000000              	call 	bin_to_decimal_str
   157 000000B3 891D[40020000]          	mov 	[exitcode], ebx
   158                                  
   159 000000B9 BE[2D020000]            	mov 	esi, child_exitcode
   160 000000BE E88C000000              	call 	print_msg
   161                                  _ok:
   162 000000C3 C605[7C010000]07        	mov	byte [color], 07h
   163                                  
   164 000000CA BE[54020000]            	mov 	esi, msg_ok
   165 000000CF E87B000000              	call 	print_msg
   166                                  
   167                                  _here:
   168                                  	sys	_exit
    69                              <1> 
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000D4 B801000000          <1>  mov eax, %1
    83                              <1> 
    84 000000D9 CD40                <1>  int 40h
   169                                  
   170                                  	; CPU must not come here
   171 000000DB EBE6                    	jmp	short _ok
   172                                  
   173                                  chldr:
   174                                  	; EAX = parent's process ID
   175 000000DD E882000000              	call 	bin_to_decimal_str
   176 000000E2 891D[0B020000]          	mov 	[pprocessid], ebx
   177                                  
   178 000000E8 C605[7C010000]0F        	mov	byte [color], 0Fh
   179                                  
   180 000000EF BE[F6010000]            	mov 	esi, parent_pid
   181 000000F4 E856000000              	call 	print_msg
   182                                  
   183 000000F9 C605[7C010000]07        	mov	byte [color], 07h
   184                                  
   185 00000100 BE[5A020000]            	mov	esi, CRLF
   186 00000105 E845000000              	call	print_msg
   187                                  
   188                                  	; EXEC child process (replaced by another program) 
   189                                  	sys	_exec, prgfilename, prgp
    69                              <1> 
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000010A BB[93010000]        <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 0000010F B9[AF010000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000114 B80B000000          <1>  mov eax, %1
    83                              <1> 
    84 00000119 CD40                <1>  int 40h
   190                                  
   191 0000011B 7324                    	jnc	short chld_exit2 ; eax = exit code
   192                                  
   193 0000011D 3C02                    	cmp	al, 2 ; File Not Found
   194 0000011F 75B3                    	jne	short _here
   195                                  
   196 00000121 C605[7C010000]0F        	mov	byte [color], 0Fh
   197                                  
   198 00000128 BE[93010000]            	mov	esi, prgfilename
   199 0000012D E81D000000              	call	print_msg
   200                                  
   201 00000132 BE[9F010000]            	mov	esi, not_found
   202 00000137 E813000000              	call	print_msg
   203                                  
   204                                  chld_exit:
   205 0000013C B8D1000000              	mov	eax, 209
   206                                  chld_exit2:
   207                                  	; eax = exit code
   208 00000141 89C3                    	mov	ebx, eax
   209                                  	sys 	_exit
    69                              <1> 
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000143 B801000000          <1>  mov eax, %1
    83                              <1> 
    84 00000148 CD40                <1>  int 40h
   210                                  
   211 0000014A E974FFFFFF                      jmp     _ok
   212                                  
   213                                  print_msg:
   214                                  	sys 	_msg, esi, 255, [color]
    69                              <1> 
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000014F 89F3                <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 00000151 B9FF000000          <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 00000156 8B15[7C010000]      <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000015C B823000000          <1>  mov eax, %1
    83                              <1> 
    84 00000161 CD40                <1>  int 40h
   215                                  			; message with color (max. 255 chars)
   216 00000163 C3                      	retn
   217                                  
   218                                  bin_to_decimal_str:
   219                                  	; eax = binary number
   220 00000164 B90A000000              	mov	ecx, 10
   221 00000169 31DB                    	xor	ebx, ebx
   222                                  btd_@:
   223 0000016B 31D2                    	xor	edx, edx
   224 0000016D F7F1                      	div	ecx
   225 0000016F C1E308                  	shl	ebx, 8
   226 00000172 80C230                  	add	dl, '0'
   227 00000175 88D3                    	mov	bl, dl
   228 00000177 09C0                    	or	eax, eax
   229 00000179 75F0                    	jnz	short btd_@
   230                                  btd_@@:
   231                                  	; ebx = db 'nnn', 0
   232 0000017B C3                      	retn
   233                                  
   234                                  ;-----------------------------------------------------------------
   235                                  
   236 0000017C 00000000                color:	dd 0
   237                                  
   238                                  child_name:
   239 00000180 0D0A                    	db 0Dh, 0Ah
   240 00000182 4368696C6420505247-     	db "Child PRG Name: ", 0
   240 0000018B 204E616D653A2000   
   241                                  prgfilename:
   242 00000193 494E56414C49442E50-     	db "INVALID.PRG",0
   242 0000019C 524700             
   243                                  ;arguments:
   244                                  	;dd 0
   245                                  
   246                                  not_found:
   247 0000019F 206E6F7420666F756E-     	db " not found ! ", 0Dh, 0Ah, 0
   247 000001A8 642021200D0A00     
   248                                  
   249 000001AF [93010000]              prgp:	dd prgfilename
   250                                  	;dd arguments
   251 000001B3 00000000                	dd 0
   252 000001B7 00000000                	dd 0
   253                                  
   254                                  ;-----------------------------------------------------------------
   255                                  ;  messages
   256                                  ;-----------------------------------------------------------------
   257                                  
   258 000001BB 00000000                cpid:		dd 0
   259                                  
   260 000001BF 0D0A                    sysexit_test:	db 0Dh, 0Ah
   261 000001C1 5452444F5320333836-     		db 'TRDOS 386 v2.0.9 - <sysexit> exit code -return- test'
   261 000001CA 2076322E302E39202D-
   261 000001D3 203C73797365786974-
   261 000001DC 3E206578697420636F-
   261 000001E5 6465202D7265747572-
   261 000001EE 6E2D2074657374     
   262 000001F5 00                      		db 0
   263 000001F6 0D0A                    parent_pid:	db 0Dh, 0Ah
   264 000001F8 506172656E74205072-     		db 'Parent Process ID: '
   264 00000201 6F636573732049443A-
   264 0000020A 20                 
   265 0000020B 30303030                pprocessid:	dd 30303030h
   266 0000020F 0D0A                    		db 0Dh, 0Ah
   267                                  sizeofparentpid equ $ - parent_pid
   268 00000211 00                      		db 0
   269                                  
   270 00000212 0D0A                    child_pid:	db 0Dh, 0Ah
   271 00000214 4368696C642050726F-     		db 'Child Process ID: '
   271 0000021D 636573732049443A20 
   272 00000226 30303030                cprocessid:	dd 30303030h
   273 0000022A 0D0A                    		db 0Dh, 0Ah
   274                                  sizeofchildpid equ $ - child_pid
   275 0000022C 00                      		db 0
   276                                  
   277 0000022D 0D0A                    child_exitcode:	db 0Dh, 0Ah
   278 0000022F 4368696C6420457869-     		db 'Child Exit Code: '
   278 00000238 7420436F64653A20   
   279 00000240 30303030                exitcode:	dd 30303030h
   280 00000244 0D0A                    		db 0Dh, 0Ah
   281                                  sizeofchildexit	equ $ - child_exitcode
   282 00000246 00                      		db 0
   283                                  msg_err:
   284 00000247 0D0A                    		db 0Dh, 0Ah 
   285 00000249 4572726F72202120                        db 'Error ! '
   286 00000251 0D0A00                  		db 0Dh, 0Ah, 0
   287                                  msg_ok:
   288 00000254 0D0A                            	db 0Dh, 0Ah
   289 00000256 4F4B2E20                        	db 'OK. '
   290                                  CRLF:
   291 0000025A 0D0A                            	db 0Dh, 0Ah
   292                                  sizeof_ok 	equ $ - msg_ok
   293                                  sizeof_CRLF 	equ $ - CRLF
   294 0000025C 00                              	db 0
