1 ; **************************************************************************** 2 ; exectst3.s - TRDOS 386 (TRDOS v2.0) Kernel - 'sysexec' and 'sysfork' test 3 ; ---------------------------------------------------------------------------- 4 ; 5 ; 24/01/2021 6 ; 7 ; **************************************************************************** 8 ; nasm exectst3.s -l exectst3.txt -o EXECTST3.PRG -Z error.txt 9 10 ; exectest.s (EXECTEST.PRG) - 19/11/2017 ('sysexec' test with 'sysfork') 11 ; exectst2.s (EXECTST2.PRG) - 12/11/2017 ('sysexec' test without 'sysfork') 12 ; exectst3.s (EXECTST3.PRG) - 24/01/2021 ('sysexec' test with 'sysfork') 13 14 ; 14/07/2020 15 ; 31/12/2017 16 ; TRDOS 386 (v2.0) system calls 17 _ver equ 0 18 _exit equ 1 19 _fork equ 2 20 _read equ 3 21 _write equ 4 22 _open equ 5 23 _close equ 6 24 _wait equ 7 25 _create equ 8 26 _rename equ 9 27 _delete equ 10 28 _exec equ 11 29 _chdir equ 12 30 _time equ 13 31 _mkdir equ 14 32 _chmod equ 15 33 _rmdir equ 16 34 _break equ 17 35 _drive equ 18 36 _seek equ 19 37 _tell equ 20 38 _memory equ 21 39 _prompt equ 22 40 _path equ 23 41 _env equ 24 42 _stime equ 25 43 _quit equ 26 44 _intr equ 27 45 _dir equ 28 46 _emt equ 29 47 _ldrvt equ 30 48 _video equ 31 49 _audio equ 32 50 _timer equ 33 51 _sleep equ 34 52 _msg equ 35 53 _geterr equ 36 54 _fpstat equ 37 55 _pri equ 38 56 _rele equ 39 57 _fff equ 40 58 _fnf equ 41 59 _alloc equ 42 60 _dalloc equ 43 61 _calbac equ 44 62 _dma equ 45 63 64 %macro sys 1-4 65 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 66 ; 03/09/2015 67 ; 13/04/2015 68 ; Retro UNIX 386 v1 system call. 69 %if %0 >= 2 70 mov ebx, %2 71 %if %0 >= 3 72 mov ecx, %3 73 %if %0 = 4 74 mov edx, %4 75 %endif 76 %endif 77 %endif 78 mov eax, %1 79 ;int 30h 80 int 40h ; TRDOS 386 (TRDOS v2.0) 81 %endmacro 82 83 ; Retro UNIX 386 v1 system call format: 84 ; sys systemcall (eax) , , 85 86 [BITS 32] ; We need 32-bit intructions for protected mode 87 88 [ORG 0] 89 90 START_CODE: 91 ; clear bss 92 00000000 BF[9C020000] mov edi, bss_start 93 00000005 B921000000 mov ecx, (bss_end - bss_start)/4 94 ;xor eax, eax 95 0000000A F3AB rep stosd 96 97 ; program message 98 0000000C BE[A5010000] mov esi, program_msg 99 00000011 E8D9000000 call print_msg 100 101 00000016 E896000000 call file_name_input 102 0000001B 7262 jc short terminate 103 104 ; EBX = EAX = file name or path address 105 ; CL = file attributes (archive = 20h, read only = 01h) 106 ; (21h = Archived & Read Only files are included) 107 ; CH = 0 = basic parameters (24 bytes) 108 ; EDX = DTA = buffer address (24 bytes for basic parameters) 109 ; EAX = _fff = 'Find First File' system call for TRDOS 386 110 111 ; Find First File 112 sys _fff, prg_file_name, 0021h, DTA 112 <1> 112 <1> 112 <1> 112 <1> 112 <1> %if %0 >= 2 112 0000001D BB[C0020000] <1> mov ebx, %2 112 <1> %if %0 >= 3 112 00000022 B921000000 <1> mov ecx, %3 112 <1> %if %0 = 4 112 00000027 BA[9C020000] <1> mov edx, %4 112 <1> %endif 112 <1> %endif 112 <1> %endif 112 0000002C B828000000 <1> mov eax, %1 112 <1> 112 00000031 CD40 <1> int 40h 113 00000033 730C jnc short _2 114 _1: 115 00000035 BE[29020000] mov esi, not_found_msg 116 0000003A E8B0000000 call print_msg 117 118 0000003F EB3E jmp short terminate 119 _2: 120 ; check file attributes 121 00000041 F605[9C020000]1E test byte [DTA], 1Eh ; 10h = directory, 08h = volume label 122 ; 04h = system, 02h = hidden 123 00000048 75EB jnz short _1 ; attributes are not proper 124 125 ; atributes are proper 126 0000004A BE[45020000] mov esi, press_any_key_msg 127 0000004F E89B000000 call print_msg 128 129 00000054 30E4 xor ah, ah 130 00000056 CD32 int 32h 131 132 00000058 BE[73020000] mov esi, nextline 133 0000005D E88D000000 call print_msg 134 135 00000062 BB[88000000] mov ebx, child_exec 136 sys _fork 136 <1> 136 <1> 136 <1> 136 <1> 136 <1> %if %0 >= 2 136 <1> mov ebx, %2 136 <1> %if %0 >= 3 136 <1> mov ecx, %3 136 <1> %if %0 = 4 136 <1> mov edx, %4 136 <1> %endif 136 <1> %endif 136 <1> %endif 136 00000067 B802000000 <1> mov eax, %1 136 <1> 136 0000006C CD40 <1> int 40h 137 138 sys _wait 138 <1> 138 <1> 138 <1> 138 <1> 138 <1> %if %0 >= 2 138 <1> mov ebx, %2 138 <1> %if %0 >= 3 138 <1> mov ecx, %3 138 <1> %if %0 = 4 138 <1> mov edx, %4 138 <1> %endif 138 <1> %endif 138 <1> %endif 138 0000006E B807000000 <1> mov eax, %1 138 <1> 138 00000073 CD40 <1> int 40h 139 140 parent_return: 141 00000075 BE[0D020000] mov esi, msg_ok 142 0000007A E870000000 call print_msg 143 terminate: 144 sys _exit 144 <1> 144 <1> 144 <1> 144 <1> 144 <1> %if %0 >= 2 144 <1> mov ebx, %2 144 <1> %if %0 >= 3 144 <1> mov ecx, %3 144 <1> %if %0 = 4 144 <1> mov edx, %4 144 <1> %endif 144 <1> %endif 144 <1> %endif 144 0000007F B801000000 <1> mov eax, %1 144 <1> 144 00000084 CD40 <1> int 40h 145 halt: 146 00000086 EBFE jmp short halt 147 148 child_exec: 149 ; execute (run) program 150 sys _exec, prg_file_name, prgp 150 <1> 150 <1> 150 <1> 150 <1> 150 <1> %if %0 >= 2 150 00000088 BB[C0020000] <1> mov ebx, %2 150 <1> %if %0 >= 3 150 0000008D B9[8D020000] <1> mov ecx, %3 150 <1> %if %0 = 4 150 <1> mov edx, %4 150 <1> %endif 150 <1> %endif 150 <1> %endif 150 00000092 B80B000000 <1> mov eax, %1 150 <1> 150 00000097 CD40 <1> int 40h 151 152 ; Error if child returns here 153 154 sys _msg, error_msg, 255, 0Eh 154 <1> 154 <1> 154 <1> 154 <1> 154 <1> %if %0 >= 2 154 00000099 BB[76020000] <1> mov ebx, %2 154 <1> %if %0 >= 3 154 0000009E B9FF000000 <1> mov ecx, %3 154 <1> %if %0 = 4 154 000000A3 BA0E000000 <1> mov edx, %4 154 <1> %endif 154 <1> %endif 154 <1> %endif 154 000000A8 B823000000 <1> mov eax, %1 154 <1> 154 000000AD CD40 <1> int 40h 155 000000AF EBCE jmp short terminate 156 157 file_name_input: 158 ; subroutine for entering file name to run 159 160 000000B1 BE[FA010000] mov esi, prg_file_name_msg 161 000000B6 E834000000 call print_msg 162 000000BB E840000000 call rw_char 163 000000C0 7214 jc short fni_1 164 000000C2 BF[C0020000] mov edi, prg_file_name 165 000000C7 803E20 cmp byte [esi], 20h 166 000000CA 760A jna short short fni_1 167 000000CC B90C000000 mov ecx, 12 168 fni_0: 169 000000D1 AC lodsb 170 000000D2 3C20 cmp al, 20h 171 000000D4 7306 jnb short fni_2 172 fni_1: 173 ;mov [edi], 0 174 ;inc edi 175 ;loop fni_1 176 ;jmp short fni_3 ; find_file 177 178 000000D6 28C0 sub al, al ; 0 179 000000D8 F3AA rep stosb 180 000000DA EB05 jmp short fni_3 ; find_file 181 fni_2: 182 000000DC 8807 mov byte [edi], al 183 000000DE 47 inc edi 184 000000DF E2F0 loop fni_0 185 fni_3: 186 000000E1 803D[C0020000]21 cmp byte [prg_file_name], 21h 187 000000E8 7215 jb short fni_4 ; cf = 1 188 189 ; next line 190 000000EA BE[73020000] mov esi, nextline 191 print_msg: 192 000000EF B40E mov ah, 0Eh 193 000000F1 BB07000000 mov ebx, 7 194 ;mov bl, 7 ; char attribute & color 195 p_next_chr: 196 000000F6 AC lodsb 197 000000F7 08C0 or al, al 198 000000F9 7404 jz short fni_4 ; retn 199 000000FB CD31 int 31h 200 000000FD EBF7 jmp short p_next_chr 201 fni_4: 202 000000FF C3 retn 203 204 rw_char: 205 ; file name (text) input routine 206 ; OUTPUT -> esi = Entered String (ASCIIZ) 207 00000100 BE[C0020000] mov esi, prg_file_name 208 00000105 BB07000000 mov ebx, 7 209 0000010A B403 mov ah, 3 210 ;int 10h 211 0000010C CD31 int 31h 212 0000010E 668915[CE020000] mov [cursor_pos], dx 213 00000115 EB0A jmp short read_next_char 214 loc_arrow: 215 00000117 80FC4B cmp ah, 4Bh 216 0000011A 7415 je short loc_back 217 0000011C 80FC53 cmp ah, 53h 218 0000011F 7410 je short loc_back 219 read_next_char: 220 00000121 30E4 xor ah, ah 221 ;int 16h 222 00000123 CD32 int 32h 223 00000125 20C0 and al, al 224 00000127 74EE jz short loc_arrow 225 00000129 3CE0 cmp al, 0E0h 226 0000012B 74EA je short loc_arrow 227 0000012D 3C08 cmp al, 08h 228 0000012F 753C jne short char_return 229 loc_back: 230 00000131 B307 mov bl, 7 231 00000133 B403 mov ah, 3 232 ;int 10h 233 00000135 CD31 int 31h 234 00000137 3A15[CE020000] cmp dl, [cursor_pos] 235 0000013D 7708 ja short prev_column 236 loc_beep: 237 0000013F B40E mov ah, 0Eh 238 00000141 B007 mov al, 7 239 ;int 10h 240 00000143 CD31 int 31h 241 00000145 EBDA jmp short read_next_char 242 prev_column: 243 00000147 FECA dec dl 244 set_cursor_pos: 245 00000149 B402 mov ah, 02h 246 ;int 10h 247 0000014B CD31 int 31h 248 0000014D 88D3 mov bl, dl 249 0000014F 2A1D[CE020000] sub bl, [cursor_pos] 250 00000155 66B90100 mov cx, 1 251 00000159 B409 mov ah, 09h 252 0000015B B020 mov al, 20h 253 0000015D 88041E mov [esi+ebx], al 254 loc_write_it: 255 00000160 B307 mov bl, 7 256 ;int 10h 257 00000162 CD31 int 31h 258 00000164 668B15[CE020000] mov dx, [cursor_pos] 259 0000016B EBB4 jmp short read_next_char 260 ;loc_arrow: 261 ; cmp ah, 4Bh 262 ; je short loc_back 263 ; cmp AH, 53h 264 ; je short loc_back 265 ; jmp short read_next_char 266 char_return: 267 0000016D B307 mov bl, 7 268 0000016F B403 mov ah, 3 269 ;int 10h 270 00000171 CD31 int 31h 271 00000173 88D3 mov bl, dl 272 00000175 2A1D[CE020000] sub bl, [cursor_pos] 273 0000017B 3C20 cmp al, 20h 274 0000017D 7220 jb short loc_escape 275 0000017F 80FB3F cmp bl, 63 276 00000182 77BB ja short loc_beep 277 ;cmp al, "z" 278 ;ja short read_next_char 279 ;cmp al, "a" 280 ;jb short pass_capitalize 281 ;and al, 0DFh 282 pass_capitalize: 283 00000184 30E4 xor ah, ah 284 00000186 6689041E mov [esi+ebx], ax 285 0000018A B40E mov ah, 0Eh 286 0000018C B307 mov bl, 7 287 ;int 10h 288 0000018E CD31 int 31h 289 00000190 EB8F jmp short read_next_char 290 pass_escape: 291 00000192 3C0D cmp al, 0Dh 292 00000194 758B jne short read_next_char 293 00000196 B307 mov bl, 7 294 ;int 10h 295 00000198 CD31 int 31h 296 0000019A B00A mov al, 0Ah 297 ;int 10h 298 0000019C CD31 int 31h 299 0000019E C3 retn 300 loc_escape: 301 0000019F 3C1B cmp al, 1Bh 302 000001A1 75EF jne short pass_escape 303 000001A3 F9 stc 304 000001A4 C3 retn 305 306 program_msg: 307 000001A5 0D0A db 0Dh, 0Ah 308 000001A7 5452444F5320333836- db "TRDOS 386 v2.0 - 'sysexec' & 'sysfork' Test Program" 308 000001B0 2076322E30202D2027- 308 000001B9 737973657865632720- 308 000001C2 262027737973666F72- 308 000001CB 6B2720546573742050- 308 000001D4 726F6772616D 309 000001DA 0D0A db 0Dh, 0Ah 310 000001DC 6279204572646F6761- db "by Erdogan Tan - 24/01/2021" 310 000001E5 6E2054616E202D2032- 310 000001EE 342F30312F32303231 311 000001F7 0D0A00 db 0Dh, 0Ah, 0 312 prg_file_name_msg: 313 000001FA 0D0A db 0Dh, 0Ah 314 000001FC 5052472046696C6520- db "PRG File Name : ", 0 314 00000205 4E616D65203A2000 315 msg_ok: 316 ;db 0Dh, 0Ah 317 0000020D 2852657475726E2074- db "(Return to parent is) OK." 317 00000216 6F20706172656E7420- 317 0000021F 697329204F4B2E 318 00000226 0D0A00 db 0Dh, 0Ah, 0 319 not_found_msg: 320 00000229 0D0A db 0Dh, 0Ah 321 0000022B 50726F6772616D2066- db "Program file not found!" 321 00000234 696C65206E6F742066- 321 0000023D 6F756E6421 322 00000242 0D0A00 db 0Dh, 0Ah, 0 323 press_any_key_msg: 324 00000245 0D0A db 0Dh, 0Ah 325 00000247 507265737320616E79- db "Press any key to run (child) program file .." 325 00000250 206B657920746F2072- 325 00000259 756E20286368696C64- 325 00000262 292070726F6772616D- 325 0000026B 2066696C65202E2E 326 nextline: 327 00000273 0D0A00 db 0Dh, 0Ah, 0 328 error_msg: 329 00000276 0D0A07 db 0Dh, 0Ah, 07h 330 00000279 277379736578656327- db "'sysexec' error !" 330 00000282 206572726F722021 331 0000028A 0D0A db 0Dh, 0Ah 332 0000028C 00 db 0 333 334 0000028D [C0020000] prgp: dd prg_file_name 335 00000291 [D0020000] dd arguments 336 00000295 00000000 dd 0 337 338 bss: 339 340 ABSOLUTE bss 341 342 00000299 alignb 4 343 344 bss_start: 345 346 0000029C DTA: resb 24 347 348 000002B4 alignb 16 349 350 prg_file_name: 351 000002C0 resb 13 352 000002CD resb 1 353 354 cursor_pos: 355 000002CE resw 1 356 357 arguments: 358 000002D0 resb 80 359 360 bss_end: