     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) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    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 <program file name> <arguments>'
   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 <res 00000050>          prgfilename:  resb 80
   251 000002F0 <res 00000050>          arguments:    resb 80
   252                                  
   253                                  bss_end:	
