     1                                  ; ****************************************************************************
     2                                  ; forktest.s - TRDOS 386 (TRDOS v2.0) Kernel - 'sysfork' test
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 12/11/2017
     6                                  ;
     7                                  ; [ Last Modification: 12/11/2017 ]
     8                                  ;
     9                                  ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
    10                                  ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
    11                                  ;
    12                                  ; Derived from 'Retro UNIX 386 v1' FORK TEST source code by Erdogan Tan
    13                                  ; ('forkstest.s', 17/09/2015)
    14                                  ;
    15                                  ; ****************************************************************************
    16                                  ; forktest.s, 17/09/2015 (Retro UNIX 386 v1, NASM 2.11)
    17                                  
    18                                  ; 20/08/2017
    19                                  ; 01/03/2017
    20                                  ; 16/10/2016
    21                                  ; 29/04/2016
    22                                  ; TRDOS 386 system calls (temporary list!)
    23                                  _ver 	equ 0
    24                                  _exit 	equ 1
    25                                  _fork 	equ 2
    26                                  _read 	equ 3
    27                                  _write	equ 4
    28                                  _open	equ 5
    29                                  _close 	equ 6
    30                                  _wait 	equ 7
    31                                  _creat 	equ 8
    32                                  _link 	equ 9
    33                                  _unlink	equ 10
    34                                  _exec	equ 11
    35                                  _chdir	equ 12
    36                                  _time 	equ 13
    37                                  _mkdir 	equ 14
    38                                  _chmod	equ 15
    39                                  _chown	equ 16
    40                                  _break	equ 17
    41                                  _stat	equ 18
    42                                  _seek	equ 19
    43                                  _tell 	equ 20
    44                                  _mount	equ 21
    45                                  _umount	equ 22
    46                                  _setuid	equ 23
    47                                  _getuid	equ 24
    48                                  _stime	equ 25
    49                                  _quit	equ 26	
    50                                  _intr	equ 27
    51                                  _fstat	equ 28
    52                                  _emt 	equ 29
    53                                  _mdate 	equ 30
    54                                  _video 	equ 31
    55                                  _audio	equ 32
    56                                  _timer	equ 33
    57                                  _sleep	equ 34
    58                                  _msg    equ 35
    59                                  _geterr	equ 36
    60                                  _fpsave	equ 37
    61                                  _pri	equ 38
    62                                  _rele	equ 39
    63                                  _fff	equ 40
    64                                  _fnf	equ 41
    65                                  _alloc	equ 42
    66                                  _dalloc equ 43
    67                                  _calbac equ 44
    68                                  _dma	equ 45	
    69                                  
    70                                  %macro sys 1-4
    71                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    72                                      ; 03/09/2015	
    73                                      ; 13/04/2015
    74                                      ; Retro UNIX 386 v1 system call.	
    75                                      %if %0 >= 2   
    76                                          mov ebx, %2
    77                                          %if %0 >= 3    
    78                                              mov ecx, %3
    79                                              %if %0 = 4
    80                                                 mov edx, %4   
    81                                              %endif
    82                                          %endif
    83                                      %endif
    84                                      mov eax, %1
    85                                      ;int 30h
    86                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    87                                  %endmacro
    88                                  
    89                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    90                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    91                                  
    92                                  ;========================================================================
    93                                  ; FORK TEST - CODE
    94                                  ;========================================================================
    95                                  
    96                                  [BITS 32] ; We need 32-bit intructions for protected mode
    97                                  
    98                                  [ORG 0] 
    99                                  START_CODE:
   100 00000000 BE[AC000000]            	mov 	esi, sysfork_test
   101 00000005 E877000000              	call 	print_msg
   102                                  
   103 0000000A BB[50000000]                  	mov 	ebx, chldr
   104                                  	sys 	_fork
   104                              <1> 
   104                              <1> 
   104                              <1> 
   104                              <1> 
   104                              <1>  %if %0 >= 2
   104                              <1>  mov ebx, %2
   104                              <1>  %if %0 >= 3
   104                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   104                              <1>  mov edx, %4
   104                              <1>  %endif
   104                              <1>  %endif
   104                              <1>  %endif
   104 0000000F B802000000          <1>  mov eax, %1
   104                              <1> 
   104 00000014 CD40                <1>  int 40h
   105 00000016 725D                    	jc 	short error	
   106                                  
   107                                  	; eAX = process id
   108 00000018 E878000000              	call 	bin_to_hex
   109 0000001D 66A3[F6000000]          	mov 	[cpid], ax
   110                                  
   111 00000023 BE[C9000000]            	mov 	esi, parent_return
   112 00000028 E854000000              	call 	print_msg
   113                                  
   114                                  	; 12/11/2017
   115                                  	;sys	_read, 0, chr, 1
   116                                  
   117                                  	;xor	ah, ah
   118                                  	;int	32h
   119                                  pwait:
   120                                  	sys 	_wait
   120                              <1> 
   120                              <1> 
   120                              <1> 
   120                              <1> 
   120                              <1>  %if %0 >= 2
   120                              <1>  mov ebx, %2
   120                              <1>  %if %0 >= 3
   120                              <1>  mov ecx, %3
   120                              <1>  %if %0 = 4
   120                              <1>  mov edx, %4
   120                              <1>  %endif
   120                              <1>  %endif
   120                              <1>  %endif
   120 0000002D B807000000          <1>  mov eax, %1
   120                              <1> 
   120 00000032 CD40                <1>  int 40h
   121 00000034 723F                    	jc 	short error
   122                                  
   123 00000036 E85A000000              	call 	bin_to_hex ; 17/09/2015
   124 0000003B 663B05[F6000000]        	cmp 	ax, [cpid]
   125 00000042 75E9                    	jne 	short pwait
   126                                  f1b:
   127 00000044 BE[3A010000]            	mov 	esi, msg_ok
   128 00000049 E833000000              	call 	print_msg
   129                                  
   130 0000004E EB1E                    	jmp 	short here	
   131                                  chldr:
   132                                  	; eAX = process id
   133 00000050 E840000000              	call 	bin_to_hex
   134 00000055 66A3[28010000]          	mov 	[ppid], ax
   135                                  
   136 0000005B BE[FB000000]            	mov 	esi, child_return
   137 00000060 E81C000000              	call 	print_msg
   138                                  
   139                                  	sys 	_exit
   139                              <1> 
   139                              <1> 
   139                              <1> 
   139                              <1> 
   139                              <1>  %if %0 >= 2
   139                              <1>  mov ebx, %2
   139                              <1>  %if %0 >= 3
   139                              <1>  mov ecx, %3
   139                              <1>  %if %0 = 4
   139                              <1>  mov edx, %4
   139                              <1>  %endif
   139                              <1>  %endif
   139                              <1>  %endif
   139 00000065 B801000000          <1>  mov eax, %1
   139                              <1> 
   139 0000006A CD40                <1>  int 40h
   140                                  
   141 0000006C EBD6                            jmp     short f1b
   142                                  here:	
   143                                  	sys	_exit
   143                              <1> 
   143                              <1> 
   143                              <1> 
   143                              <1> 
   143                              <1>  %if %0 >= 2
   143                              <1>  mov ebx, %2
   143                              <1>  %if %0 >= 3
   143                              <1>  mov ecx, %3
   143                              <1>  %if %0 = 4
   143                              <1>  mov edx, %4
   143                              <1>  %endif
   143                              <1>  %endif
   143                              <1>  %endif
   143 0000006E B801000000          <1>  mov eax, %1
   143                              <1> 
   143 00000073 CD40                <1>  int 40h
   144                                  	; hlt
   145                                  	; jmp 	short here
   146                                  
   147                                  error:
   148 00000075 BE[2D010000]            	mov 	esi, msg_err
   149 0000007A E802000000              	call 	print_msg
   150 0000007F EBED                            jmp 	short here
   151                                   
   152                                  print_msg:
   153                                  	sys 	_msg, esi, 255, 0Ah ; message with light green color (max. 255 chars)
   153                              <1> 
   153                              <1> 
   153                              <1> 
   153                              <1> 
   153                              <1>  %if %0 >= 2
   153 00000081 89F3                <1>  mov ebx, %2
   153                              <1>  %if %0 >= 3
   153 00000083 B9FF000000          <1>  mov ecx, %3
   153                              <1>  %if %0 = 4
   153 00000088 BA0A000000          <1>  mov edx, %4
   153                              <1>  %endif
   153                              <1>  %endif
   153                              <1>  %endif
   153 0000008D B823000000          <1>  mov eax, %1
   153                              <1> 
   153 00000092 CD40                <1>  int 40h
   154 00000094 C3                      	retn
   155                                  
   156                                  bin_to_hex:
   157 00000095 D410                    	db 	0D4h, 10h	; Undocumented inst. AAM
   158                                  				; AH = AL / 10h
   159                                  				; AL = AL MOD 10h
   160 00000097 660D3030                	or 	ax, '00'        ; Make it ZERO (ASCII) based
   161                                  
   162 0000009B 86E0                    	xchg 	ah, al
   163                                  
   164 0000009D 3C39                    	cmp 	al, '9'
   165 0000009F 7602                            jna     short f1f
   166 000000A1 0407                    	add 	al, 7
   167                                  f1f:
   168 000000A3 80FC39                  	cmp 	ah, '9'
   169 000000A6 7603                            jna     short f2f
   170 000000A8 80C407                  	add 	ah, 7
   171                                  f2f:
   172 000000AB C3                      	retn
   173                                  
   174                                  ;-----------------------------------------------------------------
   175                                  ;  messages
   176                                  ;-----------------------------------------------------------------
   177                                  
   178 000000AC 0D0A                    sysfork_test:	db 0Dh, 0Ah
   179 000000AE 5452444F5320333836-     		db 'TRDOS 386 - <sysfork> test'
   179 000000B7 202D203C737973666F-
   179 000000C0 726B3E2074657374   
   180 000000C8 00                      		db 0
   181 000000C9 0D0A                    parent_return:	db 0Dh, 0Ah
   182 000000CB 546869732069732070-     		db 'This is parent return !'
   182 000000D4 6172656E7420726574-
   182 000000DD 75726E2021         
   183 000000E2 0D0A                    		db 0Dh, 0Ah
   184 000000E4 4368696C642050726F-     		db 'Child Process ID: '
   184 000000ED 636573732049443A20 
   185 000000F6 3030                    cpid:           dw 3030h
   186 000000F8 0D0A                    		db 0Dh, 0Ah
   187                                  sizeofparentr   equ $ - parent_return
   188 000000FA 00                      		db 0
   189 000000FB 0D0A                    child_return:	db 0Dh, 0Ah
   190 000000FD 546869732069732063-     		db 'This is child return !'
   190 00000106 68696C642072657475-
   190 0000010F 726E2021           
   191 00000113 0D0A                    		db 0Dh, 0Ah
   192 00000115 506172656E74205072-     		db 'Parent Process ID: '
   192 0000011E 6F636573732049443A-
   192 00000127 20                 
   193 00000128 3030                    ppid:           dw 3030h
   194 0000012A 0D0A                    		db 0Dh, 0Ah
   195                                  sizeofchildr	equ $ - child_return
   196 0000012C 00                      		db 0
   197                                  msg_err:
   198 0000012D 0D0A                    		db 0Dh, 0Ah 
   199 0000012F 4572726F72202120                        db 'Error ! '
   200 00000137 0D0A00                  		db 0Dh, 0Ah, 0
   201                                  msg_ok:
   202 0000013A 0D0A                            	db 0Dh, 0Ah
   203 0000013C 4F4B2E20                        	db 'OK. '
   204 00000140 0D0A                            	db 0Dh, 0Ah
   205                                  sizeof_ok 	equ $ - msg_ok 
   206 00000142 00                              	db 0
   207 00000143 00                      chr:		db 0	
