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) , , 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 - 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