1 ; **************************************************************************** 2 ; exectst2.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.s (EXECTEST.PRG) - 19/11/2017 ('sysexec' test with 'sysfork') 11 ; EXECTEST2.PRG : direct sysexec test (without 'sysfork') 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[A002] 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 0F8238010000 jb pmsg_usage ; nothing to do 108 00000017 7707 ja short a_0 109 00000019 C605[A5010000]00 mov byte [maxargslength], 0 110 a_0: 111 ; 18/11/2017 112 00000020 48 dec eax 113 00000021 A2[A0020000] 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[A3020000] 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 0F8213010000 jb pmsg_usage 125 0000003C AA stosb 126 a_1: 127 0000003D FE0D[A4010000] 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[F3020000] mov edi, arguments 140 141 ; 18/11/2017 142 00000052 FE0D[A0020000] 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[A5010000] dec byte [maxargslength] 155 0000006C 75F2 jnz short a_3 156 a_6: 157 ; 18/11/2017 158 0000006E FE0D[A0020000] dec byte [argc] 159 00000074 7413 jz short a_4 160 00000076 FE0D[A5010000] 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[DA010000] <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 child_exec: 181 sys _msg, msg_program2, 255, 0Ah 181 <1> 181 <1> 181 <1> 181 <1> 181 <1> %if %0 >= 2 181 000000A2 BB[2A020000] <1> mov ebx, %2 181 <1> %if %0 >= 3 181 000000A7 B9FF000000 <1> mov ecx, %3 181 <1> %if %0 = 4 181 000000AC BA0A000000 <1> mov edx, %4 181 <1> %endif 181 <1> %endif 181 <1> %endif 181 000000B1 B823000000 <1> mov eax, %1 181 <1> 181 000000B6 CD40 <1> int 40h 182 sys _msg, prgfilename, 255, 0Ch 182 <1> 182 <1> 182 <1> 182 <1> 182 <1> %if %0 >= 2 182 000000B8 BB[A3020000] <1> mov ebx, %2 182 <1> %if %0 >= 3 182 000000BD B9FF000000 <1> mov ecx, %3 182 <1> %if %0 = 4 182 000000C2 BA0C000000 <1> mov edx, %4 182 <1> %endif 182 <1> %endif 182 <1> %endif 182 000000C7 B823000000 <1> mov eax, %1 182 <1> 182 000000CC CD40 <1> int 40h 183 184 000000CE 803D[A5010000]00 cmp byte [maxargslength], 0 185 000000D5 762C jna short a_5 186 187 sys _msg, msg_program3, 255, 0Ah 187 <1> 187 <1> 187 <1> 187 <1> 187 <1> %if %0 >= 2 187 000000D7 BB[3B020000] <1> mov ebx, %2 187 <1> %if %0 >= 3 187 000000DC B9FF000000 <1> mov ecx, %3 187 <1> %if %0 = 4 187 000000E1 BA0A000000 <1> mov edx, %4 187 <1> %endif 187 <1> %endif 187 <1> %endif 187 000000E6 B823000000 <1> mov eax, %1 187 <1> 187 000000EB CD40 <1> int 40h 188 sys _msg, arguments, 255, 0Ch 188 <1> 188 <1> 188 <1> 188 <1> 188 <1> %if %0 >= 2 188 000000ED BB[F3020000] <1> mov ebx, %2 188 <1> %if %0 >= 3 188 000000F2 B9FF000000 <1> mov ecx, %3 188 <1> %if %0 = 4 188 000000F7 BA0C000000 <1> mov edx, %4 188 <1> %endif 188 <1> %endif 188 <1> %endif 188 000000FC B823000000 <1> mov eax, %1 188 <1> 188 00000101 CD40 <1> int 40h 189 a_5: 190 sys _msg, msg_program4, 255, 0Fh 190 <1> 190 <1> 190 <1> 190 <1> 190 <1> %if %0 >= 2 190 00000103 BB[4C020000] <1> mov ebx, %2 190 <1> %if %0 >= 3 190 00000108 B9FF000000 <1> mov ecx, %3 190 <1> %if %0 = 4 190 0000010D BA0F000000 <1> mov edx, %4 190 <1> %endif 190 <1> %endif 190 <1> %endif 190 00000112 B823000000 <1> mov eax, %1 190 <1> 190 00000117 CD40 <1> int 40h 191 192 00000119 30E4 xor ah, ah 193 0000011B CD32 int 32h 194 195 0000011D 3C1B cmp al, 1Bh ; ESC key 196 0000011F 745C je short child_cancel 197 198 sys _exec, prgfilename, prgp 198 <1> 198 <1> 198 <1> 198 <1> 198 <1> %if %0 >= 2 198 00000121 BB[A3020000] <1> mov ebx, %2 198 <1> %if %0 >= 3 198 00000126 B9[98010000] <1> mov ecx, %3 198 <1> %if %0 = 4 198 <1> mov edx, %4 198 <1> %endif 198 <1> %endif 198 <1> %endif 198 0000012B B80B000000 <1> mov eax, %1 198 <1> 198 00000130 CD40 <1> int 40h 199 200 sys _msg, error_msg, 255, 0Eh 200 <1> 200 <1> 200 <1> 200 <1> 200 <1> %if %0 >= 2 200 00000132 BB[88020000] <1> mov ebx, %2 200 <1> %if %0 >= 3 200 00000137 B9FF000000 <1> mov ecx, %3 200 <1> %if %0 = 4 200 0000013C BA0E000000 <1> mov edx, %4 200 <1> %endif 200 <1> %endif 200 <1> %endif 200 00000141 B823000000 <1> mov eax, %1 200 <1> 200 00000146 CD40 <1> int 40h 201 202 terminate: 203 sys _exit 203 <1> 203 <1> 203 <1> 203 <1> 203 <1> %if %0 >= 2 203 <1> mov ebx, %2 203 <1> %if %0 >= 3 203 <1> mov ecx, %3 203 <1> %if %0 = 4 203 <1> mov edx, %4 203 <1> %endif 203 <1> %endif 203 <1> %endif 203 00000148 B801000000 <1> mov eax, %1 203 <1> 203 0000014D CD40 <1> int 40h 204 205 pmsg_usage: 206 sys _msg, msg_program1, 255, 0Ah 206 <1> 206 <1> 206 <1> 206 <1> 206 <1> %if %0 >= 2 206 0000014F BB[DA010000] <1> mov ebx, %2 206 <1> %if %0 >= 3 206 00000154 B9FF000000 <1> mov ecx, %3 206 <1> %if %0 = 4 206 00000159 BA0A000000 <1> mov edx, %4 206 <1> %endif 206 <1> %endif 206 <1> %endif 206 0000015E B823000000 <1> mov eax, %1 206 <1> 206 00000163 CD40 <1> int 40h 207 sys _msg, msg_usage, 255, 0Fh 207 <1> 207 <1> 207 <1> 207 <1> 207 <1> %if %0 >= 2 207 00000165 BB[A6010000] <1> mov ebx, %2 207 <1> %if %0 >= 3 207 0000016A B9FF000000 <1> mov ecx, %3 207 <1> %if %0 = 4 207 0000016F BA0F000000 <1> mov edx, %4 207 <1> %endif 207 <1> %endif 207 <1> %endif 207 00000174 B823000000 <1> mov eax, %1 207 <1> 207 00000179 CD40 <1> int 40h 208 209 0000017B EBCB jmp short terminate 210 211 child_cancel: 212 sys _msg, msg_program6, 255, 0Eh 212 <1> 212 <1> 212 <1> 212 <1> 212 <1> %if %0 >= 2 212 0000017D BB[7C020000] <1> mov ebx, %2 212 <1> %if %0 >= 3 212 00000182 B9FF000000 <1> mov ecx, %3 212 <1> %if %0 = 4 212 00000187 BA0E000000 <1> mov edx, %4 212 <1> %endif 212 <1> %endif 212 <1> %endif 212 0000018C B823000000 <1> mov eax, %1 212 <1> 212 00000191 CD40 <1> int 40h 213 00000193 EBB3 jmp short terminate 214 215 00000195 90 align 4 216 00000198 [A3020000] prgp: dd prgfilename 217 0000019C [F3020000] dd arguments 218 000001A0 00000000 dd 0 219 220 000001A4 4F maxfnlength: db 79 221 000001A5 4F maxargslength: db 79 222 223 ;----------------------------------------------------------------- 224 ; messages 225 ;----------------------------------------------------------------- 226 227 msg_usage: 228 000001A6 0D0A db 0Dh, 0Ah 229 000001A8 55736167653A206578- db 'Usage: exectest ' 229 000001B1 656374657374203C70- 229 000001BA 726F6772616D206669- 229 000001C3 6C65206E616D653E20- 229 000001CC 3C617267756D656E74- 229 000001D5 733E 230 000001D7 0D0A00 db 0Dh, 0Ah, 0 231 232 msg_program1: 233 000001DA 45584543544553542E- db "EXECTEST.PRG /// TRDOS 386 'sysexec' test program" 233 000001E3 505247202F2F2F2054- 233 000001EC 52444F532033383620- 233 000001F5 277379736578656327- 233 000001FE 20746573742070726F- 233 00000207 6772616D 234 0000020B 0D0A db 0Dh, 0Ah 235 0000020D 6279204572646F6761- db "by Erdogan Tan, 19/11/2017", 0Dh, 0Ah, 0 235 00000216 6E2054616E2C203139- 235 0000021F 2F31312F323031370D- 235 00000228 0A00 236 msg_program2: 237 0000022A 0D0A db 0Dh, 0Ah 238 0000022C 50524F4752414D204E- db "PROGRAM NAME: ", 0 238 00000235 414D453A2000 239 msg_program3: 240 0000023B 0D0A db 0Dh, 0Ah 241 0000023D 417267756D656E7428- db "Argument(s) : ", 0 241 00000246 7329203A2000 242 msg_program4: 243 0000024C 0D0A db 0Dh, 0Ah 244 0000024E 507265737320616E79- db "Press any key to run the program..." 244 00000257 206B657920746F2072- 244 00000260 756E20746865207072- 244 00000269 6F6772616D2E2E2E 245 00000271 0D0A00 db 0Dh, 0Ah, 0 246 msg_program5: 247 00000274 0D0A db 0Dh, 0Ah 248 00000276 4F4B2E db "OK." 249 00000279 0D0A00 db 0Dh, 0Ah, 0 250 251 msg_program6: 252 0000027C 0D0A db 0Dh, 0Ah 253 0000027E 43414E43454C2E db "CANCEL." 254 00000285 0D0A00 db 0Dh, 0Ah, 0 255 256 error_msg: 257 00000288 0D0A07 db 0Dh, 0Ah, 07h 258 0000028B 277379736578656327- db "'sysexec' error ! " 258 00000294 206572726F72202120 259 0000029D 0D0A db 0Dh, 0Ah 260 0000029F 00 db 0 261 262 bss_start: 263 264 alignb 4 ; 19/11/2017 265 266 ABSOLUTE bss_start 267 268 ;======================================================================== 269 ; UNINITIALIZED DATA 270 ;======================================================================== 271 272 argc: resb 0 ; 18/11/2017 273 274 000002A0 resb 3 ; 19/11/2017 275 276 ;alignb 4 277 278 000002A3 prgfilename: resb 80 279 000002F3 arguments: resb 80 280 281 ;alignb4 282 283 bss_end: