1 ; **************************************************************************** 2 ; exectest.s - TRDOS 386 (TRDOS v2.0) Kernel - 'sysexec' test 3 ; ---------------------------------------------------------------------------- 4 ; 5 ; 12/11/2017 6 ; 7 ; [ Last Modification: 12/11/2017 ] 8 ; 9 ; **************************************************************************** 10 11 ; 20/08/2017 12 ; 01/03/2017 13 ; 16/10/2016 14 ; 29/04/2016 15 ; TRDOS 386 system calls (temporary list!) 16 _ver equ 0 17 _exit equ 1 18 _fork equ 2 19 _read equ 3 20 _write equ 4 21 _open equ 5 22 _close equ 6 23 _wait equ 7 24 _creat equ 8 25 _link equ 9 26 _unlink equ 10 27 _exec equ 11 28 _chdir equ 12 29 _time equ 13 30 _mkdir equ 14 31 _chmod equ 15 32 _chown equ 16 33 _break equ 17 34 _stat equ 18 35 _seek equ 19 36 _tell equ 20 37 _mount equ 21 38 _umount equ 22 39 _setuid equ 23 40 _getuid equ 24 41 _stime equ 25 42 _quit equ 26 43 _intr equ 27 44 _fstat equ 28 45 _emt equ 29 46 _mdate equ 30 47 _video equ 31 48 _audio equ 32 49 _timer equ 33 50 _sleep equ 34 51 _msg equ 35 52 _geterr equ 36 53 _fpsave equ 37 54 _pri equ 38 55 _rele equ 39 56 _fff equ 40 57 _fnf equ 41 58 _alloc equ 42 59 _dalloc equ 43 60 _calbac equ 44 61 _dma equ 45 62 63 %macro sys 1-4 64 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 65 ; 03/09/2015 66 ; 13/04/2015 67 ; Retro UNIX 386 v1 system call. 68 %if %0 >= 2 69 mov ebx, %2 70 %if %0 >= 3 71 mov ecx, %3 72 %if %0 = 4 73 mov edx, %4 74 %endif 75 %endif 76 %endif 77 mov eax, %1 78 ;int 30h 79 int 40h ; TRDOS 386 (TRDOS v2.0) 80 %endmacro 81 82 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 83 ; sys systemcall (eax) , , 84 85 ;======================================================================== 86 ; EXEC TEST - CODE 87 ;======================================================================== 88 89 [BITS 32] ; 32-bit intructions 90 91 [ORG 0] 92 93 START_CODE: 94 ; clear bss 95 ;mov edi, bss_start ; 96 00000000 66BF[A002] mov di, bss_start 97 00000004 B928000000 mov ecx, (bss_end - bss_start)/4 98 ;xor eax, eax 99 00000009 F3AB rep stosd 100 GetFileName: 101 0000000B 89E6 mov esi, esp 102 0000000D AD lodsd 103 0000000E 83F802 cmp eax, 2 ; two arguments 104 ; (program file name & mod file name) 105 00000011 0F823B010000 jb pmsg_usage ; nothing to do 106 00000017 7707 ja short a_0 107 00000019 C605[A5010000]00 mov byte [maxargslength], 0 108 a_0: 109 00000020 AD lodsd ; name of this program 110 00000021 AD lodsd ; program file name address (to be launched) 111 00000022 89C6 mov esi, eax 112 00000024 BF[A0020000] mov edi, prgfilename 113 ScanName: 114 00000029 AC lodsb 115 0000002A 3C20 cmp al, 20h 116 0000002C 74FB je short ScanName ; scan start of name. 117 0000002E 0F821E010000 jb pmsg_usage 118 00000034 AA stosb 119 a_1: 120 00000035 FE0D[A4010000] dec byte [maxfnlength] 121 0000003B 7408 jz short a_2 122 0000003D AC lodsb 123 0000003E 3C20 cmp al, 20h 124 00000040 7603 jna short a_2 125 00000042 AA stosb 126 00000043 EBF0 jmp short a_1 127 a_2: 128 ;mov ebx, edi 129 ;sub ebx, prg_file_name ; file name length 130 ;mov [maxfnlength], bl 131 132 00000045 BF[F0020000] mov edi, arguments 133 a_3: 134 0000004A 803D[A5010000]00 cmp byte [maxargslength], 0 135 00000051 760E jna short a_4 136 00000053 AC lodsb 137 00000054 FE0D[A5010000] dec byte [maxargslength] 138 0000005A 3C20 cmp al, 20h 139 0000005C 7603 jna short a_4 140 0000005E AA stosb 141 0000005F EBE9 jmp short a_3 142 a_4: 143 ;mov ecx, edi 144 ;sub ecx, arguments ; arguments length 145 ;mov [maxargslength], cl 146 147 sys _msg, msg_program1, 255, 0Bh 147 <1> 147 <1> 147 <1> 147 <1> 147 <1> %if %0 >= 2 147 00000061 BB[DA010000] <1> mov ebx, %2 147 <1> %if %0 >= 3 147 00000066 B9FF000000 <1> mov ecx, %3 147 <1> %if %0 = 4 147 0000006B BA0B000000 <1> mov edx, %4 147 <1> %endif 147 <1> %endif 147 <1> %endif 147 00000070 B823000000 <1> mov eax, %1 147 <1> 147 00000075 CD40 <1> int 40h 148 149 00000077 BB[A5000000] mov ebx, child_exec 150 sys _fork 150 <1> 150 <1> 150 <1> 150 <1> 150 <1> %if %0 >= 2 150 <1> mov ebx, %2 150 <1> %if %0 >= 3 150 <1> mov ecx, %3 150 <1> %if %0 = 4 150 <1> mov edx, %4 150 <1> %endif 150 <1> %endif 150 <1> %endif 150 0000007C B802000000 <1> mov eax, %1 150 <1> 150 00000081 CD40 <1> int 40h 151 152 sys _wait 152 <1> 152 <1> 152 <1> 152 <1> 152 <1> %if %0 >= 2 152 <1> mov ebx, %2 152 <1> %if %0 >= 3 152 <1> mov ecx, %3 152 <1> %if %0 = 4 152 <1> mov edx, %4 152 <1> %endif 152 <1> %endif 152 <1> %endif 152 00000083 B807000000 <1> mov eax, %1 152 <1> 152 00000088 CD40 <1> int 40h 153 154 parent_return: 155 sys _msg, msg_program5, 255, 0Bh 155 <1> 155 <1> 155 <1> 155 <1> 155 <1> %if %0 >= 2 155 0000008A BB[74020000] <1> mov ebx, %2 155 <1> %if %0 >= 3 155 0000008F B9FF000000 <1> mov ecx, %3 155 <1> %if %0 = 4 155 00000094 BA0B000000 <1> mov edx, %4 155 <1> %endif 155 <1> %endif 155 <1> %endif 155 00000099 B823000000 <1> mov eax, %1 155 <1> 155 0000009E CD40 <1> int 40h 156 000000A0 E9A6000000 jmp terminate 157 158 child_exec: 159 sys _msg, msg_program2, 255, 0Bh 159 <1> 159 <1> 159 <1> 159 <1> 159 <1> %if %0 >= 2 159 000000A5 BB[2A020000] <1> mov ebx, %2 159 <1> %if %0 >= 3 159 000000AA B9FF000000 <1> mov ecx, %3 159 <1> %if %0 = 4 159 000000AF BA0B000000 <1> mov edx, %4 159 <1> %endif 159 <1> %endif 159 <1> %endif 159 000000B4 B823000000 <1> mov eax, %1 159 <1> 159 000000B9 CD40 <1> int 40h 160 sys _msg, prgfilename, 255, 0Ch 160 <1> 160 <1> 160 <1> 160 <1> 160 <1> %if %0 >= 2 160 000000BB BB[A0020000] <1> mov ebx, %2 160 <1> %if %0 >= 3 160 000000C0 B9FF000000 <1> mov ecx, %3 160 <1> %if %0 = 4 160 000000C5 BA0C000000 <1> mov edx, %4 160 <1> %endif 160 <1> %endif 160 <1> %endif 160 000000CA B823000000 <1> mov eax, %1 160 <1> 160 000000CF CD40 <1> int 40h 161 162 000000D1 803D[A5010000]00 cmp byte [maxargslength], 0 163 000000D8 762C jna short a_5 164 165 sys _msg, msg_program3, 255, 0Ah 165 <1> 165 <1> 165 <1> 165 <1> 165 <1> %if %0 >= 2 165 000000DA BB[3B020000] <1> mov ebx, %2 165 <1> %if %0 >= 3 165 000000DF B9FF000000 <1> mov ecx, %3 165 <1> %if %0 = 4 165 000000E4 BA0A000000 <1> mov edx, %4 165 <1> %endif 165 <1> %endif 165 <1> %endif 165 000000E9 B823000000 <1> mov eax, %1 165 <1> 165 000000EE CD40 <1> int 40h 166 sys _msg, arguments, 255, 0Dh 166 <1> 166 <1> 166 <1> 166 <1> 166 <1> %if %0 >= 2 166 000000F0 BB[F0020000] <1> mov ebx, %2 166 <1> %if %0 >= 3 166 000000F5 B9FF000000 <1> mov ecx, %3 166 <1> %if %0 = 4 166 000000FA BA0D000000 <1> mov edx, %4 166 <1> %endif 166 <1> %endif 166 <1> %endif 166 000000FF B823000000 <1> mov eax, %1 166 <1> 166 00000104 CD40 <1> int 40h 167 a_5: 168 sys _msg, msg_program4, 255, 0Ah 168 <1> 168 <1> 168 <1> 168 <1> 168 <1> %if %0 >= 2 168 00000106 BB[4C020000] <1> mov ebx, %2 168 <1> %if %0 >= 3 168 0000010B B9FF000000 <1> mov ecx, %3 168 <1> %if %0 = 4 168 00000110 BA0A000000 <1> mov edx, %4 168 <1> %endif 168 <1> %endif 168 <1> %endif 168 00000115 B823000000 <1> mov eax, %1 168 <1> 168 0000011A CD40 <1> int 40h 169 170 0000011C 30E4 xor ah, ah 171 0000011E CD32 int 32h 172 173 00000120 3C1B cmp al, 1Bh ; ESC key 174 00000122 745C je short child_cancel 175 176 sys _exec, prgfilename, prgp 176 <1> 176 <1> 176 <1> 176 <1> 176 <1> %if %0 >= 2 176 00000124 BB[A0020000] <1> mov ebx, %2 176 <1> %if %0 >= 3 176 00000129 B9[98010000] <1> mov ecx, %3 176 <1> %if %0 = 4 176 <1> mov edx, %4 176 <1> %endif 176 <1> %endif 176 <1> %endif 176 0000012E B80B000000 <1> mov eax, %1 176 <1> 176 00000133 CD40 <1> int 40h 177 178 sys _msg, error_msg, 255, 0Eh 178 <1> 178 <1> 178 <1> 178 <1> 178 <1> %if %0 >= 2 178 00000135 BB[88020000] <1> mov ebx, %2 178 <1> %if %0 >= 3 178 0000013A B9FF000000 <1> mov ecx, %3 178 <1> %if %0 = 4 178 0000013F BA0E000000 <1> mov edx, %4 178 <1> %endif 178 <1> %endif 178 <1> %endif 178 00000144 B823000000 <1> mov eax, %1 178 <1> 178 00000149 CD40 <1> int 40h 179 180 terminate: 181 sys _exit 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 0000014B B801000000 <1> mov eax, %1 181 <1> 181 00000150 CD40 <1> int 40h 182 183 pmsg_usage: 184 sys _msg, msg_program1, 255, 0Ah 184 <1> 184 <1> 184 <1> 184 <1> 184 <1> %if %0 >= 2 184 00000152 BB[DA010000] <1> mov ebx, %2 184 <1> %if %0 >= 3 184 00000157 B9FF000000 <1> mov ecx, %3 184 <1> %if %0 = 4 184 0000015C BA0A000000 <1> mov edx, %4 184 <1> %endif 184 <1> %endif 184 <1> %endif 184 00000161 B823000000 <1> mov eax, %1 184 <1> 184 00000166 CD40 <1> int 40h 185 sys _msg, msg_usage, 255, 0Ah 185 <1> 185 <1> 185 <1> 185 <1> 185 <1> %if %0 >= 2 185 00000168 BB[A6010000] <1> mov ebx, %2 185 <1> %if %0 >= 3 185 0000016D B9FF000000 <1> mov ecx, %3 185 <1> %if %0 = 4 185 00000172 BA0A000000 <1> mov edx, %4 185 <1> %endif 185 <1> %endif 185 <1> %endif 185 00000177 B823000000 <1> mov eax, %1 185 <1> 185 0000017C CD40 <1> int 40h 186 187 0000017E EBCB jmp short terminate 188 189 child_cancel: 190 sys _msg, msg_program6, 255, 0Eh 190 <1> 190 <1> 190 <1> 190 <1> 190 <1> %if %0 >= 2 190 00000180 BB[7C020000] <1> mov ebx, %2 190 <1> %if %0 >= 3 190 00000185 B9FF000000 <1> mov ecx, %3 190 <1> %if %0 = 4 190 0000018A BA0E000000 <1> mov edx, %4 190 <1> %endif 190 <1> %endif 190 <1> %endif 190 0000018F B823000000 <1> mov eax, %1 190 <1> 190 00000194 CD40 <1> int 40h 191 00000196 EBB3 jmp short terminate 192 193 align 4 194 00000198 [A0020000] prgp: dd prgfilename 195 0000019C [F0020000] dd arguments 196 000001A0 00000000 dd 0 197 198 000001A4 4F maxfnlength: db 79 199 000001A5 4F maxargslength: db 79 200 201 ;----------------------------------------------------------------- 202 ; messages 203 ;----------------------------------------------------------------- 204 205 msg_usage: 206 000001A6 0D0A db 0Dh, 0Ah 207 000001A8 55736167653A206578- db 'Usage: exectest ' 207 000001B1 656374657374203C70- 207 000001BA 726F6772616D206669- 207 000001C3 6C65206E616D653E20- 207 000001CC 3C617267756D656E74- 207 000001D5 733E 208 000001D7 0D0A00 db 0Dh, 0Ah, 0 209 210 msg_program1: 211 000001DA 45584543544553542E- db "EXECTEST.PRG /// TRDOS 386 'sysexec' test program" 211 000001E3 505247202F2F2F2054- 211 000001EC 52444F532033383620- 211 000001F5 277379736578656327- 211 000001FE 20746573742070726F- 211 00000207 6772616D 212 0000020B 0D0A db 0Dh, 0Ah 213 0000020D 6279204572646F6761- db "by Erdogan Tan, 12/11/2017", 0Dh, 0Ah, 0 213 00000216 6E2054616E2C203132- 213 0000021F 2F31312F323031370D- 213 00000228 0A00 214 msg_program2: 215 0000022A 0D0A db 0Dh, 0Ah 216 0000022C 50524F4752414D204E- db "PROGRAM NAME: ", 0 216 00000235 414D453A2000 217 msg_program3: 218 0000023B 0D0A db 0Dh, 0Ah 219 0000023D 417267756D656E7428- db "Argument(s) : ", 0 219 00000246 7329203A2000 220 msg_program4: 221 0000024C 0D0A db 0Dh, 0Ah 222 0000024E 507265737320616E79- db "Press any key to run the program..." 222 00000257 206B657920746F2072- 222 00000260 756E20746865207072- 222 00000269 6F6772616D2E2E2E 223 00000271 0D0A00 db 0Dh, 0Ah, 0 224 msg_program5: 225 00000274 0D0A db 0Dh, 0Ah 226 00000276 4F4B2E db "OK." 227 00000279 0D0A00 db 0Dh, 0Ah, 0 228 229 msg_program6: 230 0000027C 0D0A db 0Dh, 0Ah 231 0000027E 43414E43454C2E db "CANCEL." 232 00000285 0D0A00 db 0Dh, 0Ah, 0 233 234 error_msg: 235 00000288 0D0A07 db 0Dh, 0Ah, 07h 236 0000028B 277379736578656327- db "'sysexec' error ! " 236 00000294 206572726F72202120 237 0000029D 0D0A db 0Dh, 0Ah 238 0000029F 00 db 0 239 240 bss_start: 241 242 ABSOLUTE bss_start 243 244 ;======================================================================== 245 ; UNINITIALIZED DATA 246 ;======================================================================== 247 248 alignb 4 249 250 000002A0 prgfilename: resb 80 251 000002F0 arguments: resb 80 252 253 bss_end: