     1                                  ; ****************************************************************************
     2                                  ; exittest.s - TRDOS 386 (TRDOS v2.0) Kernel - 'sysexit' exit code test
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 20/08/2024
     6                                  ;
     7                                  ; [ Last Modification: 23/08/2024 ]
     8                                  ;
     9                                  ; Derived from 'TRDOS 386 v2' FORK TEST source code by Erdogan Tan
    10                                  ; ('forkstest.s', 12/11/2017)
    11                                  ;
    12                                  ; ****************************************************************************
    13                                  ; forktest.s, 17/09/2015 (Retro UNIX 386 v1, NASM 2.11)
    14                                  
    15                                  ; 20/08/2024 ; TRDOS 386 v2.0.9 (exit code)
    16                                  ; 20/08/2017
    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                                  _dma	equ 45
    67                                  _stdio  equ 46	;  TRDOS 386 v2.0.9
    68                                  
    69                                  %macro sys 1-4
    70                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    71                                      ; 03/09/2015	
    72                                      ; 13/04/2015
    73                                      ; Retro UNIX 386 v1 system call.	
    74                                      %if %0 >= 2   
    75                                          mov ebx, %2
    76                                          %if %0 >= 3    
    77                                              mov ecx, %3
    78                                              %if %0 = 4
    79                                                 mov edx, %4   
    80                                              %endif
    81                                          %endif
    82                                      %endif
    83                                      mov eax, %1
    84                                      ;int 30h
    85                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    86                                  %endmacro
    87                                  
    88                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    89                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    90                                  
    91                                  ;========================================================================
    92                                  ; FORK TEST - CODE
    93                                  ;========================================================================
    94                                  
    95                                  [BITS 32] ; 32-bit intructions
    96                                  
    97                                  [ORG 0] 
    98                                  START_CODE:
    99 00000000 BE[DC000000]            	mov 	esi, sysexit_test
   100 00000005 E89C000000              	call 	print_msg
   101                                  
   102 0000000A BB[84000000]                  	mov 	ebx, chldr
   103                                  	sys 	_fork
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1> 
    74                              <1>  %if %0 >= 2
    75                              <1>  mov ebx, %2
    76                              <1>  %if %0 >= 3
    77                              <1>  mov ecx, %3
    78                              <1>  %if %0 = 4
    79                              <1>  mov edx, %4
    80                              <1>  %endif
    81                              <1>  %endif
    82                              <1>  %endif
    83 0000000F B802000000          <1>  mov eax, %1
    84                              <1> 
    85 00000014 CD40                <1>  int 40h
   104 00000016 725B                    	jc 	short error
   105                                  
   106 00000018 A3[D8000000]            	mov	[cpid], eax ; child's process ID
   107                                  
   108 0000001D BF[21010000]            	mov	edi, pprocessid
   109 00000022 E893000000              	call 	bin_to_decimal_str
   110                                  
   111                                  pwait:
   112 00000027 BBE7030000              	mov	ebx, 999 ; this must not return
   113                                  	sys 	_wait
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1> 
    74                              <1>  %if %0 >= 2
    75                              <1>  mov ebx, %2
    76                              <1>  %if %0 >= 3
    77                              <1>  mov ecx, %3
    78                              <1>  %if %0 = 4
    79                              <1>  mov edx, %4
    80                              <1>  %endif
    81                              <1>  %endif
    82                              <1>  %endif
    83 0000002C B807000000          <1>  mov eax, %1
    84                              <1> 
    85 00000031 CD40                <1>  int 40h
   114 00000033 723E                    	jc 	short error
   115                                  
   116 00000035 3B05[D8000000]          	cmp 	eax, [cpid]
   117 0000003B 75EA                    	jne 	short pwait	
   118                                  
   119                                  	; EAX = child's process id (AX)
   120                                  	; EBX = child's exit code (BL) ; must be 209
   121                                  
   122 0000003D 53                      	push	ebx  ; exit code
   123                                  
   124 0000003E BF[3C010000]            	mov	edi, cprocessid
   125 00000043 E872000000              	call 	bin_to_decimal_str
   126                                  
   127 00000048 BE[28010000]            	mov 	esi, child_pid
   128 0000004D E854000000              	call 	print_msg
   129                                  
   130 00000052 58                      	pop	eax
   131                                  
   132 00000053 BF[56010000]            	mov	edi, exitcode
   133 00000058 E85D000000              	call 	bin_to_decimal_str
   134                                  
   135 0000005D BE[43010000]            	mov 	esi, child_exitcode
   136 00000062 E83F000000              	call 	print_msg
   137                                  _ok:
   138 00000067 BE[6A010000]            	mov 	esi, msg_ok
   139 0000006C E835000000              	call 	print_msg
   140                                  
   141 00000071 EB0A                    	jmp 	short here
   142                                  
   143                                  error:
   144 00000073 BE[5D010000]            	mov 	esi, msg_err
   145 00000078 E829000000              	call 	print_msg
   146                                   	;jmp 	short here
   147                                  here:	
   148                                  	sys	_exit
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1> 
    74                              <1>  %if %0 >= 2
    75                              <1>  mov ebx, %2
    76                              <1>  %if %0 >= 3
    77                              <1>  mov ecx, %3
    78                              <1>  %if %0 = 4
    79                              <1>  mov edx, %4
    80                              <1>  %endif
    81                              <1>  %endif
    82                              <1>  %endif
    83 0000007D B801000000          <1>  mov eax, %1
    84                              <1> 
    85 00000082 CD40                <1>  int 40h
   149                                  	; hlt
   150                                  	; jmp 	short here
   151                                  	
   152                                  chldr:
   153                                  	; EAX = parent's process ID
   154 00000084 BF[21010000]            	mov	edi, pprocessid
   155 00000089 E82C000000              	call 	bin_to_decimal_str
   156                                  
   157 0000008E BE[0C010000]            	mov 	esi, parent_pid
   158 00000093 E80E000000              	call 	print_msg
   159                                  
   160 00000098 BBD1000000              	mov	ebx, 209
   161                                  	sys 	_exit
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1> 
    74                              <1>  %if %0 >= 2
    75                              <1>  mov ebx, %2
    76                              <1>  %if %0 >= 3
    77                              <1>  mov ecx, %3
    78                              <1>  %if %0 = 4
    79                              <1>  mov edx, %4
    80                              <1>  %endif
    81                              <1>  %endif
    82                              <1>  %endif
    83 0000009D B801000000          <1>  mov eax, %1
    84                              <1> 
    85 000000A2 CD40                <1>  int 40h
   162                                  
   163 000000A4 EBC1                            jmp     short _ok
   164                                  
   165                                  print_msg:
   166                                  	sys 	_msg, esi, 255, 0Fh ; message with white color (max. 255 chars)
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1> 
    74                              <1>  %if %0 >= 2
    75 000000A6 89F3                <1>  mov ebx, %2
    76                              <1>  %if %0 >= 3
    77 000000A8 B9FF000000          <1>  mov ecx, %3
    78                              <1>  %if %0 = 4
    79 000000AD BA0F000000          <1>  mov edx, %4
    80                              <1>  %endif
    81                              <1>  %endif
    82                              <1>  %endif
    83 000000B2 B823000000          <1>  mov eax, %1
    84                              <1> 
    85 000000B7 CD40                <1>  int 40h
   167 000000B9 C3                      	retn
   168                                  
   169                                  bin_to_decimal_str:
   170                                  	; eax = binary number
   171 000000BA B90A000000              	mov	ecx, 10
   172 000000BF 89E5                    	mov	ebp, esp
   173                                  btd_@:
   174 000000C1 31D2                    	xor	edx, edx
   175 000000C3 F7F1                      	div	ecx
   176 000000C5 52                      	push	edx
   177 000000C6 09C0                    	or	eax, eax
   178 000000C8 75F7                    	jnz	short btd_@
   179                                  btd_@@:
   180 000000CA 59                      	pop	ecx
   181 000000CB 88C8                    	mov	al, cl
   182 000000CD 0430                    	add	al, '0'
   183 000000CF AA                      	stosb
   184 000000D0 39E5                    	cmp	ebp, esp
   185 000000D2 75F6                    	jne	short btd_@@
   186 000000D4 C60700                  	mov	byte [edi],0
   187 000000D7 C3                      	retn
   188                                  
   189                                  ;-----------------------------------------------------------------
   190                                  ;  messages
   191                                  ;-----------------------------------------------------------------
   192                                  
   193 000000D8 00000000                cpid:		dd 0
   194                                  
   195 000000DC 0D0A                    sysexit_test:	db 0Dh, 0Ah
   196 000000DE 5452444F5320333836-     		db 'TRDOS 386 - <sysexit> exit code -return- test'
   196 000000E7 202D203C7379736578-
   196 000000F0 69743E206578697420-
   196 000000F9 636F6465202D726574-
   196 00000102 75726E2D2074657374 
   197 0000010B 00                      		db 0
   198 0000010C 0D0A                    parent_pid:	db 0Dh, 0Ah
   199 0000010E 506172656E74205072-     		db 'Parent Process ID: '
   199 00000117 6F636573732049443A-
   199 00000120 20                 
   200 00000121 30303030                pprocessid:	dd 30303030h
   201 00000125 0D0A                    		db 0Dh, 0Ah
   202                                  sizeofparentpid equ $ - parent_pid
   203 00000127 00                      		db 0
   204                                  
   205 00000128 0D0A                    child_pid:	db 0Dh, 0Ah
   206 0000012A 4368696C642050726F-     		db 'Child Process ID: '
   206 00000133 636573732049443A20 
   207 0000013C 30303030                cprocessid:	dd 30303030h
   208 00000140 0D0A                    		db 0Dh, 0Ah
   209                                  sizeofchildpid equ $ - child_pid
   210 00000142 00                      		db 0
   211                                  
   212 00000143 0D0A                    child_exitcode:	db 0Dh, 0Ah
   213 00000145 4368696C6420457869-     		db 'Child Exit Code: '
   213 0000014E 7420436F64653A20   
   214 00000156 30303030                exitcode:	dd 30303030h
   215 0000015A 0D0A                    		db 0Dh, 0Ah
   216                                  sizeofchildexit	equ $ - child_exitcode
   217 0000015C 00                      		db 0
   218                                  msg_err:
   219 0000015D 0D0A                    		db 0Dh, 0Ah 
   220 0000015F 4572726F72202120                        db 'Error ! '
   221 00000167 0D0A00                  		db 0Dh, 0Ah, 0
   222                                  msg_ok:
   223 0000016A 0D0A                            	db 0Dh, 0Ah
   224 0000016C 4F4B2E20                        	db 'OK. '
   225 00000170 0D0A                            	db 0Dh, 0Ah
   226                                  sizeof_ok 	equ $ - msg_ok 
   227 00000172 00                              	db 0
