1 ; **************************************************************************** 2 ; exectest.s - TRDOS 386 (TRDOS v2.0) Kernel - 'sysexec' test 3 ; ---------------------------------------------------------------------------- 4 ; 5 ; 12/11/2017 6 ; 7 ; [ Last Modification: 19/11/2017 ] 8 ; 9 ; **************************************************************************** 10 ; EXECTEST.PRG : 'sysexec' test with 'sysfork' - 19/11/2017 11 ; EXECTST2.PRG : direct sysexec test (without 'sysfork') - 19/11/2017 12 13 ; 20/08/2017 14 ; 01/03/2017 15 ; 16/10/2016 16 ; 29/04/2016 17 ; TRDOS 386 system calls (temporary list!) 18 _ver equ 0 19 _exit equ 1 20 _fork equ 2 21 _read equ 3 22 _write equ 4 23 _open equ 5 24 _close equ 6 25 _wait equ 7 26 _creat equ 8 27 _link equ 9 28 _unlink equ 10 29 _exec equ 11 30 _chdir equ 12 31 _time equ 13 32 _mkdir equ 14 33 _chmod equ 15 34 _chown equ 16 35 _break equ 17 36 _stat equ 18 37 _seek equ 19 38 _tell equ 20 39 _mount equ 21 40 _umount equ 22 41 _setuid equ 23 42 _getuid equ 24 43 _stime equ 25 44 _quit equ 26 45 _intr equ 27 46 _fstat equ 28 47 _emt equ 29 48 _mdate equ 30 49 _video equ 31 50 _audio equ 32 51 _timer equ 33 52 _sleep equ 34 53 _msg equ 35 54 _geterr equ 36 55 _fpsave equ 37 56 _pri equ 38 57 _rele equ 39 58 _fff equ 40 59 _fnf equ 41 60 _alloc equ 42 61 _dalloc equ 43 62 _calbac equ 44 63 _dma equ 45 64 65 %macro sys 1-4 66 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 67 ; 03/09/2015 68 ; 13/04/2015 69 ; Retro UNIX 386 v1 system call. 70 %if %0 >= 2 71 mov ebx, %2 72 %if %0 >= 3 73 mov ecx, %3 74 %if %0 = 4 75 mov edx, %4 76 %endif 77 %endif 78 %endif 79 mov eax, %1 80 ;int 30h 81 int 40h ; TRDOS 386 (TRDOS v2.0) 82 %endmacro 83 84 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 85 ; sys systemcall (eax) , , 86 87 ;======================================================================== 88 ; EXEC TEST - CODE 89 ;======================================================================== 90 91 [BITS 32] ; 32-bit intructions 92 93 [ORG 0] 94 95 START_CODE: 96 ; clear bss 97 ;mov edi, bss_start ; 98 00000000 66BF[CC02] mov di, bss_start 99 00000004 B928000000 mov ecx, (bss_end - bss_start)/4 100 ;xor eax, eax 101 00000009 F3AB rep stosd 102 GetFileName: 103 0000000B 89E6 mov esi, esp 104 0000000D AD lodsd 105 0000000E 83F802 cmp eax, 2 ; two arguments 106 ; (program file name & mod file name) 107 00000011 0F8266010000 jb pmsg_usage ; nothing to do 108 00000017 7707 ja short a_0 109 00000019 C605[D1010000]00 mov byte [maxargslength], 0 110 a_0: 111 ; 18/11/2017 112 00000020 48 dec eax 113 00000021 A2[CC020000] mov [argc], al 114 ; 115 00000026 AD lodsd ; name of this program 116 00000027 AD lodsd ; program file name address (to be launched) 117 00000028 89F5 mov ebp, esi ; 18/11/2017 118 0000002A 89C6 mov esi, eax 119 0000002C BF[CF020000] mov edi, prgfilename 120 ScanName: 121 00000031 AC lodsb 122 00000032 3C20 cmp al, 20h 123 00000034 74FB je short ScanName ; scan start of name. 124 00000036 0F8241010000 jb pmsg_usage 125 0000003C AA stosb 126 a_1: 127 0000003D FE0D[D0010000] dec byte [maxfnlength] 128 00000043 7408 jz short a_2 129 00000045 AC lodsb 130 00000046 3C20 cmp al, 20h 131 00000048 7603 jna short a_2 132 0000004A AA stosb 133 0000004B EBF0 jmp short a_1 134 a_2: 135 ;mov ebx, edi 136 ;sub ebx, prg_file_name ; file name length 137 ;mov [maxfnlength], bl 138 139 0000004D BF[1F030000] mov edi, arguments 140 141 ; 18/11/2017 142 00000052 FE0D[CC020000] dec byte [argc] 143 00000058 742F jz short a_4 144 ;cmp byte [maxargslength], 0 145 ;jna short a_4 146 0000005A 8B7500 mov esi, [ebp] 147 0000005D 83C504 add ebp, 4 148 a_3: 149 00000060 AC lodsb 150 00000061 3C20 cmp al, 20h 151 ;jna short a_4 152 00000063 7609 jna short a_6 ; 18/11/2017 153 00000065 AA stosb 154 00000066 FE0D[D1010000] dec byte [maxargslength] 155 0000006C 75F2 jnz short a_3 156 a_6: 157 ; 18/11/2017 158 0000006E FE0D[CC020000] dec byte [argc] 159 00000074 7413 jz short a_4 160 00000076 FE0D[D1010000] dec byte [maxargslength] 161 0000007C 740B jz short a_4 162 0000007E B020 mov al, 20h 163 00000080 AA stosb 164 00000081 8B7500 mov esi, [ebp] 165 ;and esi, esi 166 ;jz short a_4 167 00000084 83C504 add ebp, 4 168 00000087 EBD7 jmp short a_3 169 a_4: 170 ; 18/11/2017 171 00000089 30C0 xor al, al 172 0000008B AA stosb 173 174 ;mov ecx, edi 175 ;sub ecx, arguments ; arguments length 176 ;mov [maxargslength], cl 177 178 sys _msg, msg_program1, 255, 0Bh 178 <1> 178 <1> 178 <1> 178 <1> 178 <1> %if %0 >= 2 178 0000008C BB[06020000] <1> mov ebx, %2 178 <1> %if %0 >= 3 178 00000091 B9FF000000 <1> mov ecx, %3 178 <1> %if %0 = 4 178 00000096 BA0B000000 <1> mov edx, %4 178 <1> %endif 178 <1> %endif 178 <1> %endif 178 0000009B B823000000 <1> mov eax, %1 178 <1> 178 000000A0 CD40 <1> int 40h 179 180 000000A2 BB[D0000000] mov ebx, child_exec 181 sys _fork 181 <1> 181 <1> 181 <1> 181 <1> 181 <1> %if %0 >= 2 181 <1> mov ebx, %2 181 <1> %if %0 >= 3 181 <1> mov ecx, %3 181 <1> %if %0 = 4 181 <1> mov edx, %4 181 <1> %endif 181 <1> %endif 181 <1> %endif 181 000000A7 B802000000 <1> mov eax, %1 181 <1> 181 000000AC CD40 <1> int 40h 182 183 sys _wait 183 <1> 183 <1> 183 <1> 183 <1> 183 <1> %if %0 >= 2 183 <1> mov ebx, %2 183 <1> %if %0 >= 3 183 <1> mov ecx, %3 183 <1> %if %0 = 4 183 <1> mov edx, %4 183 <1> %endif 183 <1> %endif 183 <1> %endif 183 000000AE B807000000 <1> mov eax, %1 183 <1> 183 000000B3 CD40 <1> int 40h 184 185 parent_return: 186 sys _msg, msg_program5, 255, 0Bh 186 <1> 186 <1> 186 <1> 186 <1> 186 <1> %if %0 >= 2 186 000000B5 BB[A0020000] <1> mov ebx, %2 186 <1> %if %0 >= 3 186 000000BA B9FF000000 <1> mov ecx, %3 186 <1> %if %0 = 4 186 000000BF BA0B000000 <1> mov edx, %4 186 <1> %endif 186 <1> %endif 186 <1> %endif 186 000000C4 B823000000 <1> mov eax, %1 186 <1> 186 000000C9 CD40 <1> int 40h 187 000000CB E9A6000000 jmp terminate 188 189 child_exec: 190 sys _msg, msg_program2, 255, 0Ah 190 <1> 190 <1> 190 <1> 190 <1> 190 <1> %if %0 >= 2 190 000000D0 BB[56020000] <1> mov ebx, %2 190 <1> %if %0 >= 3 190 000000D5 B9FF000000 <1> mov ecx, %3 190 <1> %if %0 = 4 190 000000DA BA0A000000 <1> mov edx, %4 190 <1> %endif 190 <1> %endif 190 <1> %endif 190 000000DF B823000000 <1> mov eax, %1 190 <1> 190 000000E4 CD40 <1> int 40h 191 sys _msg, prgfilename, 255, 0Ch 191 <1> 191 <1> 191 <1> 191 <1> 191 <1> %if %0 >= 2 191 000000E6 BB[CF020000] <1> mov ebx, %2 191 <1> %if %0 >= 3 191 000000EB B9FF000000 <1> mov ecx, %3 191 <1> %if %0 = 4 191 000000F0 BA0C000000 <1> mov edx, %4 191 <1> %endif 191 <1> %endif 191 <1> %endif 191 000000F5 B823000000 <1> mov eax, %1 191 <1> 191 000000FA CD40 <1> int 40h 192 193 000000FC 803D[D1010000]00 cmp byte [maxargslength], 0 194 00000103 762C jna short a_5 195 196 sys _msg, msg_program3, 255, 0Ah 196 <1> 196 <1> 196 <1> 196 <1> 196 <1> %if %0 >= 2 196 00000105 BB[67020000] <1> mov ebx, %2 196 <1> %if %0 >= 3 196 0000010A B9FF000000 <1> mov ecx, %3 196 <1> %if %0 = 4 196 0000010F BA0A000000 <1> mov edx, %4 196 <1> %endif 196 <1> %endif 196 <1> %endif 196 00000114 B823000000 <1> mov eax, %1 196 <1> 196 00000119 CD40 <1> int 40h 197 sys _msg, arguments, 255, 0Ch 197 <1> 197 <1> 197 <1> 197 <1> 197 <1> %if %0 >= 2 197 0000011B BB[1F030000] <1> mov ebx, %2 197 <1> %if %0 >= 3 197 00000120 B9FF000000 <1> mov ecx, %3 197 <1> %if %0 = 4 197 00000125 BA0C000000 <1> mov edx, %4 197 <1> %endif 197 <1> %endif 197 <1> %endif 197 0000012A B823000000 <1> mov eax, %1 197 <1> 197 0000012F CD40 <1> int 40h 198 a_5: 199 sys _msg, msg_program4, 255, 0Fh 199 <1> 199 <1> 199 <1> 199 <1> 199 <1> %if %0 >= 2 199 00000131 BB[78020000] <1> mov ebx, %2 199 <1> %if %0 >= 3 199 00000136 B9FF000000 <1> mov ecx, %3 199 <1> %if %0 = 4 199 0000013B BA0F000000 <1> mov edx, %4 199 <1> %endif 199 <1> %endif 199 <1> %endif 199 00000140 B823000000 <1> mov eax, %1 199 <1> 199 00000145 CD40 <1> int 40h 200 201 00000147 30E4 xor ah, ah 202 00000149 CD32 int 32h 203 204 0000014B 3C1B cmp al, 1Bh ; ESC key 205 0000014D 745C je short child_cancel 206 207 sys _exec, prgfilename, prgp 207 <1> 207 <1> 207 <1> 207 <1> 207 <1> %if %0 >= 2 207 0000014F BB[CF020000] <1> mov ebx, %2 207 <1> %if %0 >= 3 207 00000154 B9[C4010000] <1> mov ecx, %3 207 <1> %if %0 = 4 207 <1> mov edx, %4 207 <1> %endif 207 <1> %endif 207 <1> %endif 207 00000159 B80B000000 <1> mov eax, %1 207 <1> 207 0000015E CD40 <1> int 40h 208 209 sys _msg, error_msg, 255, 0Eh 209 <1> 209 <1> 209 <1> 209 <1> 209 <1> %if %0 >= 2 209 00000160 BB[B4020000] <1> mov ebx, %2 209 <1> %if %0 >= 3 209 00000165 B9FF000000 <1> mov ecx, %3 209 <1> %if %0 = 4 209 0000016A BA0E000000 <1> mov edx, %4 209 <1> %endif 209 <1> %endif 209 <1> %endif 209 0000016F B823000000 <1> mov eax, %1 209 <1> 209 00000174 CD40 <1> int 40h 210 211 terminate: 212 sys _exit 212 <1> 212 <1> 212 <1> 212 <1> 212 <1> %if %0 >= 2 212 <1> mov ebx, %2 212 <1> %if %0 >= 3 212 <1> mov ecx, %3 212 <1> %if %0 = 4 212 <1> mov edx, %4 212 <1> %endif 212 <1> %endif 212 <1> %endif 212 00000176 B801000000 <1> mov eax, %1 212 <1> 212 0000017B CD40 <1> int 40h 213 214 pmsg_usage: 215 sys _msg, msg_program1, 255, 0Ah 215 <1> 215 <1> 215 <1> 215 <1> 215 <1> %if %0 >= 2 215 0000017D BB[06020000] <1> mov ebx, %2 215 <1> %if %0 >= 3 215 00000182 B9FF000000 <1> mov ecx, %3 215 <1> %if %0 = 4 215 00000187 BA0A000000 <1> mov edx, %4 215 <1> %endif 215 <1> %endif 215 <1> %endif 215 0000018C B823000000 <1> mov eax, %1 215 <1> 215 00000191 CD40 <1> int 40h 216 sys _msg, msg_usage, 255, 0Fh 216 <1> 216 <1> 216 <1> 216 <1> 216 <1> %if %0 >= 2 216 00000193 BB[D2010000] <1> mov ebx, %2 216 <1> %if %0 >= 3 216 00000198 B9FF000000 <1> mov ecx, %3 216 <1> %if %0 = 4 216 0000019D BA0F000000 <1> mov edx, %4 216 <1> %endif 216 <1> %endif 216 <1> %endif 216 000001A2 B823000000 <1> mov eax, %1 216 <1> 216 000001A7 CD40 <1> int 40h 217 218 000001A9 EBCB jmp short terminate 219 220 child_cancel: 221 sys _msg, msg_program6, 255, 0Eh 221 <1> 221 <1> 221 <1> 221 <1> 221 <1> %if %0 >= 2 221 000001AB BB[A8020000] <1> mov ebx, %2 221 <1> %if %0 >= 3 221 000001B0 B9FF000000 <1> mov ecx, %3 221 <1> %if %0 = 4 221 000001B5 BA0E000000 <1> mov edx, %4 221 <1> %endif 221 <1> %endif 221 <1> %endif 221 000001BA B823000000 <1> mov eax, %1 221 <1> 221 000001BF CD40 <1> int 40h 222 000001C1 EBB3 jmp short terminate 223 224 000001C3 90 align 4 225 000001C4 [CF020000] prgp: dd prgfilename 226 000001C8 [1F030000] dd arguments 227 000001CC 00000000 dd 0 228 229 000001D0 4F maxfnlength: db 79 230 000001D1 4F maxargslength: db 79 231 232 ;----------------------------------------------------------------- 233 ; messages 234 ;----------------------------------------------------------------- 235 236 msg_usage: 237 000001D2 0D0A db 0Dh, 0Ah 238 000001D4 55736167653A206578- db 'Usage: exectest ' 238 000001DD 656374657374203C70- 238 000001E6 726F6772616D206669- 238 000001EF 6C65206E616D653E20- 238 000001F8 3C617267756D656E74- 238 00000201 733E 239 00000203 0D0A00 db 0Dh, 0Ah, 0 240 241 msg_program1: 242 00000206 45584543544553542E- db "EXECTEST.PRG /// TRDOS 386 'sysexec' test program" 242 0000020F 505247202F2F2F2054- 242 00000218 52444F532033383620- 242 00000221 277379736578656327- 242 0000022A 20746573742070726F- 242 00000233 6772616D 243 00000237 0D0A db 0Dh, 0Ah 244 00000239 6279204572646F6761- db "by Erdogan Tan, 19/11/2017", 0Dh, 0Ah, 0 244 00000242 6E2054616E2C203139- 244 0000024B 2F31312F323031370D- 244 00000254 0A00 245 msg_program2: 246 00000256 0D0A db 0Dh, 0Ah 247 00000258 50524F4752414D204E- db "PROGRAM NAME: ", 0 247 00000261 414D453A2000 248 msg_program3: 249 00000267 0D0A db 0Dh, 0Ah 250 00000269 417267756D656E7428- db "Argument(s) : ", 0 250 00000272 7329203A2000 251 msg_program4: 252 00000278 0D0A db 0Dh, 0Ah 253 0000027A 507265737320616E79- db "Press any key to run the program..." 253 00000283 206B657920746F2072- 253 0000028C 756E20746865207072- 253 00000295 6F6772616D2E2E2E 254 0000029D 0D0A00 db 0Dh, 0Ah, 0 255 msg_program5: 256 000002A0 0D0A db 0Dh, 0Ah 257 000002A2 4F4B2E db "OK." 258 000002A5 0D0A00 db 0Dh, 0Ah, 0 259 260 msg_program6: 261 000002A8 0D0A db 0Dh, 0Ah 262 000002AA 43414E43454C2E db "CANCEL." 263 000002B1 0D0A00 db 0Dh, 0Ah, 0 264 265 error_msg: 266 000002B4 0D0A07 db 0Dh, 0Ah, 07h 267 000002B7 277379736578656327- db "'sysexec' error ! " 267 000002C0 206572726F72202120 268 000002C9 0D0A db 0Dh, 0Ah 269 000002CB 00 db 0 270 271 bss_start: 272 273 alignb 4 ; 19/11/2017 274 275 ABSOLUTE bss_start 276 277 ;======================================================================== 278 ; UNINITIALIZED DATA 279 ;======================================================================== 280 281 argc: resb 0 ; 18/11/2017 282 283 000002CC resb 3 ; 19/11/2017 284 285 ;alignb 4 286 287 000002CF prgfilename: resb 80 288 0000031F arguments: resb 80 289 290 ;alignb4 291 292 bss_end: