     1                                  ; ****************************************************************************
     2                                  ; forktest.s - Retro Unix 386 v1 Kernel - 'sysfork' test
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
     6                                  ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
     7                                  ;
     8                                  ; Derived from 'Retro UNIX 8086 v1' source code by Erdogan Tan
     9                                  ; (v0.1 - Beginning: 11/07/2012)
    10                                  ;
    11                                  ; [ Last Modification: 17/09/2015 ]
    12                                  ;
    13                                  ; Derived from UNIX Operating System (v1.0 for PDP-11) 
    14                                  ; (Original) Source Code by Ken Thompson (Bell Laboratories, 1971-1972)
    15                                  ; ****************************************************************************
    16                                  
    17                                  ; forktest.s, 12/09/2015 (Retro UNIX 386 v1, NASM 2.11)
    18                                  ; SHELL01.ASM, 09/08/2013 (Retro UNIX 8086 v1, MASM 6.11) 
    19                                  
    20                                  ; UNIX v1 system calls
    21                                  _rele 	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                                  _stty 	equ 31
    53                                  _gtty	equ 32
    54                                  _ilgins	equ 33
    55                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    56                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    57                                  
    58                                  %macro sys 1-4
    59                                      ; 03/09/2015	
    60                                      ; 13/04/2015
    61                                      ; Retro UNIX 386 v1 system call.		
    62                                      %if %0 >= 2   
    63                                          mov ebx, %2
    64                                          %if %0 >= 3    
    65                                              mov ecx, %3
    66                                              %if %0 = 4
    67                                                 mov edx, %4   
    68                                              %endif
    69                                          %endif
    70                                      %endif
    71                                      mov eax, %1
    72                                      int 30h	   
    73                                  %endmacro
    74                                  
    75                                  ; Retro UNIX 386 v1 system call format:
    76                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    77                                  
    78                                  [BITS 32] ; We need 32-bit intructions for protected mode
    79                                  
    80                                  [ORG 0] 
    81                                  START_CODE:
    82 00000000 BE[C2000000]            	mov 	esi, sysfork_test
    83 00000005 E88D000000              	call 	print_msg
    84                                  
    85 0000000A BB[66000000]                  	mov 	ebx, chldr
    86                                  	sys 	_fork
    87                              <1> 
    88                              <1> 
    89                              <1> 
    90                              <1>  %if %0 >= 2
    91                              <1>  mov ebx, %2
    92                              <1>  %if %0 >= 3
    93                              <1>  mov ecx, %3
    94                              <1>  %if %0 = 4
    95                              <1>  mov edx, %4
    96                              <1>  %endif
    97                              <1>  %endif
    98                              <1>  %endif
    99 0000000F B802000000          <1>  mov eax, %1
   100 00000014 CD30                <1>  int 30h
   101 00000016 7273                    	jc 	short error	
   102                                  
   103                                  	; eAX = process id
   104 00000018 E88E000000              	call 	bin_to_hex
   105 0000001D 66A3[14010000]          	mov 	[cpid], ax
   106                                  
   107 00000023 BE[E7000000]            	mov 	esi, parent_return
   108 00000028 E86A000000              	call 	print_msg
   109                                  
   110                                  	sys	_read, 0, chr, 1 
   111                              <1> 
   112                              <1> 
   113                              <1> 
   114                              <1>  %if %0 >= 2
   115 0000002D BB00000000          <1>  mov ebx, %2
   116                              <1>  %if %0 >= 3
   117 00000032 B9[61010000]        <1>  mov ecx, %3
   118                              <1>  %if %0 = 4
   119 00000037 BA01000000          <1>  mov edx, %4
   120                              <1>  %endif
   121                              <1>  %endif
   122                              <1>  %endif
   123 0000003C B803000000          <1>  mov eax, %1
   124 00000041 CD30                <1>  int 30h
   125                                  pwait:
   126                                  	sys 	_wait
   127                              <1> 
   128                              <1> 
   129                              <1> 
   130                              <1>  %if %0 >= 2
   131                              <1>  mov ebx, %2
   132                              <1>  %if %0 >= 3
   133                              <1>  mov ecx, %3
   134                              <1>  %if %0 = 4
   135                              <1>  mov edx, %4
   136                              <1>  %endif
   137                              <1>  %endif
   138                              <1>  %endif
   139 00000043 B807000000          <1>  mov eax, %1
   140 00000048 CD30                <1>  int 30h
   141 0000004A 723F                    	jc 	short error
   142                                  
   143 0000004C E85A000000              	call 	bin_to_hex ; 17/09/2015
   144 00000051 663B05[14010000]        	cmp 	ax, [cpid]
   145 00000058 75E9                    	jne 	short pwait
   146                                  f1b:
   147 0000005A BE[58010000]            	mov 	esi, msg_ok
   148 0000005F E833000000              	call 	print_msg
   149                                  
   150 00000064 EB1E                    	jmp 	short here	
   151                                  chldr:
   152                                  	; eAX = process id
   153 00000066 E840000000              	call 	bin_to_hex
   154 0000006B 66A3[46010000]          	mov 	[ppid], ax
   155                                  
   156 00000071 BE[19010000]            	mov 	esi, child_return
   157 00000076 E81C000000              	call 	print_msg
   158                                  
   159                                  	sys 	_exit
   160                              <1> 
   161                              <1> 
   162                              <1> 
   163                              <1>  %if %0 >= 2
   164                              <1>  mov ebx, %2
   165                              <1>  %if %0 >= 3
   166                              <1>  mov ecx, %3
   167                              <1>  %if %0 = 4
   168                              <1>  mov edx, %4
   169                              <1>  %endif
   170                              <1>  %endif
   171                              <1>  %endif
   172 0000007B B801000000          <1>  mov eax, %1
   173 00000080 CD30                <1>  int 30h
   174                                  
   175 00000082 EBD6                            jmp     short f1b
   176                                  here:	
   177                                  	sys	_exit
   178                              <1> 
   179                              <1> 
   180                              <1> 
   181                              <1>  %if %0 >= 2
   182                              <1>  mov ebx, %2
   183                              <1>  %if %0 >= 3
   184                              <1>  mov ecx, %3
   185                              <1>  %if %0 = 4
   186                              <1>  mov edx, %4
   187                              <1>  %endif
   188                              <1>  %endif
   189                              <1>  %endif
   190 00000084 B801000000          <1>  mov eax, %1
   191 00000089 CD30                <1>  int 30h
   192                                  	; hlt
   193                                  	; jmp 	short here
   194                                  
   195                                  error:
   196 0000008B BE[4B010000]            	mov 	esi, msg_err
   197 00000090 E802000000              	call 	print_msg
   198 00000095 EBED                            jmp 	short here
   199                                   
   200                                  print_msg:
   201                                  	sys 	_msg, esi, 255, 0Ah ; message with light green color (max. 255 chars)
   202                              <1> 
   203                              <1> 
   204                              <1> 
   205                              <1>  %if %0 >= 2
   206 00000097 89F3                <1>  mov ebx, %2
   207                              <1>  %if %0 >= 3
   208 00000099 B9FF000000          <1>  mov ecx, %3
   209                              <1>  %if %0 = 4
   210 0000009E BA0A000000          <1>  mov edx, %4
   211                              <1>  %endif
   212                              <1>  %endif
   213                              <1>  %endif
   214 000000A3 B823000000          <1>  mov eax, %1
   215 000000A8 CD30                <1>  int 30h
   216 000000AA C3                      	retn
   217                                  
   218                                  bin_to_hex:
   219 000000AB D410                    	db 	0D4h, 10h	; Undocumented inst. AAM
   220                                  				; AH = AL / 10h
   221                                  				; AL = AL MOD 10h
   222 000000AD 660D3030                	or 	ax, '00'        ; Make it ZERO (ASCII) based
   223                                  
   224 000000B1 86E0                    	xchg 	ah, al
   225                                  
   226 000000B3 3C39                    	cmp 	al, '9'
   227 000000B5 7602                            jna     short f1f
   228 000000B7 0407                    	add 	al, 7
   229                                  f1f:
   230 000000B9 80FC39                  	cmp 	ah, '9'
   231 000000BC 7603                            jna     short f2f
   232 000000BE 80C407                  	add 	ah, 7
   233                                  f2f:
   234 000000C1 C3                      	retn
   235                                  
   236                                  ;-----------------------------------------------------------------
   237                                  ;  messages
   238                                  ;-----------------------------------------------------------------
   239                                  
   240 000000C2 0D0A                    sysfork_test:	db 0Dh, 0Ah
   241 000000C4 526574726F20556E69-     		db 'Retro Unix 386 v1 - <sysfork> test'
   242 000000CD 782033383620763120-
   243 000000D6 2D203C737973666F72-
   244 000000DF 6B3E2074657374     
   245 000000E6 00                      		db 0
   246 000000E7 0D0A                    parent_return:	db 0Dh, 0Ah
   247 000000E9 546869732069732070-     		db 'This is parent return !'
   248 000000F2 6172656E7420726574-
   249 000000FB 75726E2021         
   250 00000100 0D0A                    		db 0Dh, 0Ah
   251 00000102 4368696C642050726F-     		db 'Child Process ID: '
   252 0000010B 636573732049443A20 
   253 00000114 3030                    cpid:           dw 3030h
   254 00000116 0D0A                    		db 0Dh, 0Ah
   255                                  sizeofparentr   equ $ - parent_return
   256 00000118 00                      		db 0
   257 00000119 0D0A                    child_return:	db 0Dh, 0Ah
   258 0000011B 546869732069732063-     		db 'This is child return !'
   259 00000124 68696C642072657475-
   260 0000012D 726E2021           
   261 00000131 0D0A                    		db 0Dh, 0Ah
   262 00000133 506172656E74205072-     		db 'Parent Process ID: '
   263 0000013C 6F636573732049443A-
   264 00000145 20                 
   265 00000146 3030                    ppid:           dw 3030h
   266 00000148 0D0A                    		db 0Dh, 0Ah
   267                                  sizeofchildr	equ $ - child_return
   268 0000014A 00                      		db 0
   269                                  msg_err:
   270 0000014B 0D0A                    		db 0Dh, 0Ah 
   271 0000014D 4572726F72202120                        db 'Error ! '
   272 00000155 0D0A00                  		db 0Dh, 0Ah, 0
   273                                  msg_ok:
   274 00000158 0D0A                            	db 0Dh, 0Ah
   275 0000015A 4F4B2E20                        	db 'OK. '
   276 0000015E 0D0A                            	db 0Dh, 0Ah
   277                                  sizeof_ok 	equ $ - msg_ok 
   278 00000160 00                              	db 0
   279 00000161 00                      chr:		db 0	
