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