     1                                  ; ****************************************************************************
     2                                  ; sh386.s (sh7.s) - Retro Unix 386 v2 Shell - /bin/sh
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
     6                                  ; Operating System Project (v0.3) by ERDOGAN TAN (Beginning: 24/12/2013)
     7                                  ;
     8                                  ; [ Last Modification: 10/12/2015 ] !!! not completed !!!
     9                                  ;
    10                                  ; Derived from UNIX Operating System v7 - osh.c
    11                                  ; Source Code by Ken Thompson (Bell Laboratories, 1979)
    12                                  ;
    13                                  ; ****************************************************************************
    14                                  ; <sh - command interpreter>
    15                                  ; ****************************************************************************
    16                                  
    17                                  ; sh7.s (Retro UNIX 386 v2, Kernel v0.3)
    18                                  
    19                                  ; Assembler: NASM 2.11
    20                                  
    21                                  ; 05/11/2015
    22                                  
    23                                  ; UNIX v1 system calls
    24                                  _rele 	equ 0
    25                                  _exit 	equ 1
    26                                  _fork 	equ 2
    27                                  _read 	equ 3
    28                                  _write	equ 4
    29                                  _open	equ 5
    30                                  _close 	equ 6
    31                                  _wait 	equ 7 ; Returns without signal (in ebx)
    32                                  _creat 	equ 8
    33                                  _link 	equ 9
    34                                  _unlink	equ 10
    35                                  _exec	equ 11
    36                                  _chdir	equ 12
    37                                  _time 	equ 13
    38                                  _mkdir 	equ 14
    39                                  _chmod	equ 15
    40                                  _chown	equ 16
    41                                  _break	equ 17
    42                                  _stat	equ 18
    43                                  _seek	equ 19
    44                                  _tell 	equ 20
    45                                  _mount	equ 21
    46                                  _umount	equ 22
    47                                  _setuid	equ 23
    48                                  _getuid	equ 24
    49                                  _stime	equ 25
    50                                  _quit	equ 26	
    51                                  _intr	equ 27
    52                                  _fstat	equ 28
    53                                  _emt 	equ 29
    54                                  _mdate 	equ 30
    55                                  _stty 	equ 31
    56                                  _gtty	equ 32
    57                                  _ilgins	equ 33
    58                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    59                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    60                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    61                                  ; 09/12/2015
    62                                  _getpid	equ 37 ; Retro UNIX 386 v1.1
    63                                  _dup	equ 38 ; Retro UNIX 386 v1.1
    64                                  _pipe	equ 39 ; Retro UNIX 386 v1.1
    65                                  _ssig	equ 40 ; Retro UNIX 386 v1.1
    66                                  ; this is added for old version compatibility
    67                                  _waits	equ 41 ; Retro UNIX 386 v1.1 (returns with signal in EBX)
    68                                  
    69                                  %macro sys 1-4
    70                                      ; 05/11/2015
    71                                      ; 03/09/2015	
    72                                      ; 13/04/2015
    73                                      ; Retro UNIX 386 v1 (& v2) system call method.		
    74                                      %if %0 >= 2   
    75                                          mov ebx, %2
    76                                          %if %0 >= 3    
    77                                              mov ecx, %3
    78                                              %if %0 = 4
    79                                                 mov edx, %4   
    80                                              %endif
    81                                          %endif
    82                                      %endif
    83                                      mov eax, %1
    84                                      int 30h	   
    85                                  %endmacro
    86                                  
    87                                  INTR 	equ 2
    88                                  QUIT 	equ 3
    89                                  LINSIZ 	equ 1000
    90                                  ARGSIZ 	equ 50
    91                                  TRESIZ 	equ 100 ; 100*4
    92                                  
    93                                  QUOTE	equ 80h
    94                                  
    95                                  DTYP 	equ 0*4
    96                                  DLEF 	equ 1*4
    97                                  DRIT 	equ 2*4
    98                                  DFLG 	equ 3*4
    99                                  DSPR 	equ 4*4
   100                                  DCOM 	equ 5*4
   101                                  FAND 	equ 1
   102                                  FCAT 	equ 2
   103                                  FPIN 	equ 4
   104                                  FPOU 	equ 8
   105                                  FPAR 	equ 16
   106                                  FINT 	equ 32
   107                                  FPRS 	equ 64
   108                                  TCOM 	equ 1
   109                                  TPAR 	equ 2
   110                                  TFIL 	equ 3
   111                                  TLST	equ 4
   112                                  
   113                                  NSIG	equ 16
   114                                  
   115                                  ENOEXEC	equ 8
   116                                  ENOMEM	equ 12
   117                                  
   118                                  ; Retro UNIX 386 v1 system call format:
   119                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   120                                  
   121                                  [BITS 32] ; 32-bit intructions
   122                                  
   123                                  [ORG 0] 
   124                                  
   125                                  START_CODE:
   126                                  	; 05/11/2015 - Retro UNIX 386 v2
   127                                  	; Assembly source code by Erdogan Tan
   128                                  	;
   129                                  	; Source code has been derived from original UNIX v7, osh.c (1979)
   130                                  	; (Thompson Shell)
   131                                  	;
   132                                  
   133                                  main:	; mainc (c, av)
   134                                  		; esp points to argc
   135 00000000 89E5                    	mov	ebp, esp
   136 00000002 8B5D04                  	mov	ebx, [ebp+4]
   137 00000005 803B2D                  	cmp	byte [ebx], '-'
   138 00000008 7516                    	jne	short _0
   139                                  	sys	_write, 1, msg_unix_sh, msgsh_size
   140                              <1> 
   141                              <1> 
   142                              <1> 
   143                              <1> 
   144                              <1>  %if %0 >= 2
   145 0000000A BB01000000          <1>  mov ebx, %2
   146                              <1>  %if %0 >= 3
   147 0000000F B9[7A0E0000]        <1>  mov ecx, %3
   148                              <1>  %if %0 = 4
   149 00000014 BA1D000000          <1>  mov edx, %4
   150                              <1>  %endif
   151                              <1>  %endif
   152                              <1>  %endif
   153 00000019 B804000000          <1>  mov eax, %1
   154 0000001E CD30                <1>  int 30h
   155                                  _0:
   156                                  	;mov	ebx, 3  ; file descriptor (UNIX v7 - osh.c)
   157 00000020 BB02000000              	mov	ebx, 2 ; UNIX v6 - sh.c
   158                                  _1:
   159                                  	; for(f=2; f<15; f++)
   160                                  	sys 	_close	; close(f);
   161                              <1> 
   162                              <1> 
   163                              <1> 
   164                              <1> 
   165                              <1>  %if %0 >= 2
   166                              <1>  mov ebx, %2
   167                              <1>  %if %0 >= 3
   168                              <1>  mov ecx, %3
   169                              <1>  %if %0 = 4
   170                              <1>  mov edx, %4
   171                              <1>  %endif
   172                              <1>  %endif
   173                              <1>  %endif
   174 00000025 B806000000          <1>  mov eax, %1
   175 0000002A CD30                <1>  int 30h
   176 0000002C 43                      	inc	ebx
   177 0000002D 83FB0A                  	cmp 	ebx, 10 ; 15
   178 00000030 72F3                    	jb	short _1
   179                                  	;
   180                                  	;mov 	ebx, 1	; file descriptor (stdout)
   181                                  		; 0 = stdin, 1 = stdout, 2 = stderr
   182                                  	sys	_dup, 1	; duplicate file ; UNIX v6 - sh.c
   183                              <1> 
   184                              <1> 
   185                              <1> 
   186                              <1> 
   187                              <1>  %if %0 >= 2
   188 00000032 BB01000000          <1>  mov ebx, %2
   189                              <1>  %if %0 >= 3
   190                              <1>  mov ecx, %3
   191                              <1>  %if %0 = 4
   192                              <1>  mov edx, %4
   193                              <1>  %endif
   194                              <1>  %endif
   195                              <1>  %endif
   196 00000037 B826000000          <1>  mov eax, %1
   197 0000003C CD30                <1>  int 30h
   198 0000003E 720E                    	jc	short _3
   199 00000040 83F802                  	cmp	eax, 2  ; stderr
   200 00000043 7409                    	je	short _3
   201                                  	;mov	ebx, eax
   202                                  	sys	_close, eax ; close file
   203                              <1> 
   204                              <1> 
   205                              <1> 
   206                              <1> 
   207                              <1>  %if %0 >= 2
   208 00000045 89C3                <1>  mov ebx, %2
   209                              <1>  %if %0 >= 3
   210                              <1>  mov ecx, %3
   211                              <1>  %if %0 = 4
   212                              <1>  mov edx, %4
   213                              <1>  %endif
   214                              <1>  %endif
   215                              <1>  %endif
   216 00000047 B806000000          <1>  mov eax, %1
   217 0000004C CD30                <1>  int 30h
   218                                  _3:	
   219                                  	sys	_getpid	; get process id
   220                              <1> 
   221                              <1> 
   222                              <1> 
   223                              <1> 
   224                              <1>  %if %0 >= 2
   225                              <1>  mov ebx, %2
   226                              <1>  %if %0 >= 3
   227                              <1>  mov ecx, %3
   228                              <1>  %if %0 = 4
   229                              <1>  mov edx, %4
   230                              <1>  %endif
   231                              <1>  %endif
   232                              <1>  %endif
   233 0000004E B825000000          <1>  mov eax, %1
   234 00000053 CD30                <1>  int 30h
   235                                  		; eax = process id
   236 00000055 BB[33110000]            	mov	ebx, pidp + 3 ; 4 digits
   237 0000005A 66B90A00                	mov	cx, 10
   238                                  _4:
   239 0000005E 29D2                    	sub	edx, edx
   240 00000060 66F7F1                  	div	cx  ; (dx:ax)/cx
   241 00000063 80C230                  	add	dl, '0'
   242 00000066 8813                            mov     [ebx], dl ; '0'-'9'
   243 00000068 81FB[30110000]          	cmp	ebx, pidp
   244 0000006E 7603                    	jna	short _5
   245 00000070 4B                      	dec	ebx
   246 00000071 EBEB                    	jmp	short _4
   247                                  _5:
   248 00000073 66C705[990E0000]25-     	mov	word [promp], '% '
   249 0000007B 20                 
   250                                  	sys	_getuid ; get user id
   251                              <1> 
   252                              <1> 
   253                              <1> 
   254                              <1> 
   255                              <1>  %if %0 >= 2
   256                              <1>  mov ebx, %2
   257                              <1>  %if %0 >= 3
   258                              <1>  mov ecx, %3
   259                              <1>  %if %0 = 4
   260                              <1>  mov edx, %4
   261                              <1>  %endif
   262                              <1>  %endif
   263                              <1>  %endif
   264 0000007C B818000000          <1>  mov eax, %1
   265 00000081 CD30                <1>  int 30h
   266                                  		; eax = uid
   267 00000083 21C0                    	and	eax, eax
   268 00000085 7507                    	jnz	short _6
   269 00000087 C605[990E0000]23        	mov	byte [promp], '#'
   270                                  _6:
   271 0000008E 8B4D00                  	mov	ecx, [ebp] ; argument count
   272 00000091 8B5504                  	mov	edx, [ebp+4] ; argument 0 addr
   273 00000094 6683F901                	cmp	cx, 1
   274 00000098 0F868B000000                    jna     _10
   275 0000009E 8B5D08                  	mov	ebx, [ebp+8] ; argument 1 addr
   276 000000A1 66813B652D              	cmp	word [ebx], 'e-' ; "-e"
   277 000000A6 7516                    	jne	short _7
   278 000000A8 FE05[36110000]          	inc	byte [stoperr] 	
   279                                  		; move arg 0 addr to arg 1 pointer
   280 000000AE 83C408                  	add	esp, 8 ; argument 1 addr
   281 000000B1 891424                  	mov	[esp], edx ; v[1] = v[0];
   282 000000B4 49                      	dec	ecx ; argc = argc - 1
   283 000000B5 51                      	push	ecx
   284 000000B6 89E5                    	mov	ebp, esp
   285                                  	;
   286 000000B8 6683F901                	cmp	cx, 1
   287 000000BC 766B                    	jna	short _10
   288                                  _7:
   289 000000BE 66C705[990E0000]00-     	mov	word [promp], 0
   290 000000C6 00                 
   291 000000C7 89EE                    	mov 	esi, ebp ; points to argc 
   292 000000C9 AD                      	lodsd	; 
   293 000000CA AD                      	lodsd	; eax = v[0]
   294                                  	;mov	edx, eax ; argument 0 address
   295 000000CB AD                      	lodsd
   296 000000CC 89C3                    	mov	ebx, eax ; argument 1 address
   297 000000CE B02D                    	mov	al, '-'
   298 000000D0 3803                    	cmp	[ebx], al ; '-' ; argument 1
   299 000000D2 7526                    	jne	short _9
   300 000000D4 28E4                    	sub 	ah, ah ; 0
   301 000000D6 668902                  	mov	[edx], ax ; db '-', 0 ; argument 0
   302 000000D9 43                      	inc	ebx
   303 000000DA 803B63                  	cmp	byte [ebx], 'c'
   304 000000DD 750D                    	jne	short _8
   305 000000DF 83F902                  	cmp	ecx, 2
   306 000000E2 7608                    	jna	short _8
   307 000000E4 AD                      	lodsd
   308 000000E5 A3[38110000]            	mov	[arginp], eax ; argument 2 address
   309 000000EA EB3D                    	jmp 	short  _10
   310                                  _8:
   311 000000EC 803B74                  	cmp	byte [ebx], 't'
   312 000000EF 7538                    	jne	short _10
   313 000000F1 C605[3C110000]02        	mov	byte [onelflg], 2
   314 000000F8 EB2F                    	jmp	short _10		
   315                                  _9:
   316 000000FA 89DE                    	mov	esi, ebx ; new input file name addr.
   317 000000FC 29DB                    	sub	ebx, ebx ; file descriptor = 0 
   318                                  			 ; (standard input)
   319                                  	sys	_close ; close(0)
   320                              <1> 
   321                              <1> 
   322                              <1> 
   323                              <1> 
   324                              <1>  %if %0 >= 2
   325                              <1>  mov ebx, %2
   326                              <1>  %if %0 >= 3
   327                              <1>  mov ecx, %3
   328                              <1>  %if %0 = 4
   329                              <1>  mov edx, %4
   330                              <1>  %endif
   331                              <1>  %endif
   332                              <1>  %endif
   333 000000FE B806000000          <1>  mov eax, %1
   334 00000103 CD30                <1>  int 30h
   335                                  	sys	_open, esi, 0 ; open for read
   336                              <1> 
   337                              <1> 
   338                              <1> 
   339                              <1> 
   340                              <1>  %if %0 >= 2
   341 00000105 89F3                <1>  mov ebx, %2
   342                              <1>  %if %0 >= 3
   343 00000107 B900000000          <1>  mov ecx, %3
   344                              <1>  %if %0 = 4
   345                              <1>  mov edx, %4
   346                              <1>  %endif
   347                              <1>  %endif
   348                              <1>  %endif
   349 0000010C B805000000          <1>  mov eax, %1
   350 00000111 CD30                <1>  int 30h
   351 00000113 7314                    	jnc	short _10
   352                                  	;
   353 00000115 E869040000              	call	prs
   354 0000011A BE[FD0E0000]            	mov 	esi, open_err ; ": cannot open"
   355 0000011F B8FF000000              	mov	eax, 255 ; exit (error) number
   356 00000124 E821040000              	call	err
   357                                  	; xxx !!!
   358                                  _10:
   359                                  	;mov	ebx, [edx] ; argument 0 address
   360 00000129 8B5D04                  	mov	ebx, [ebp+4] ; argument 0 address
   361 0000012C 803B2D                  	cmp	byte [ebx], '-' ; argument 0 (file name)
   362 0000012F 753E                    	jne	short _13
   363                                  	sys	_ssig, QUIT, 1
   364                              <1> 
   365                              <1> 
   366                              <1> 
   367                              <1> 
   368                              <1>  %if %0 >= 2
   369 00000131 BB03000000          <1>  mov ebx, %2
   370                              <1>  %if %0 >= 3
   371 00000136 B901000000          <1>  mov ecx, %3
   372                              <1>  %if %0 = 4
   373                              <1>  mov edx, %4
   374                              <1>  %endif
   375                              <1>  %endif
   376                              <1>  %endif
   377 0000013B B828000000          <1>  mov eax, %1
   378 00000140 CD30                <1>  int 30h
   379                                  	sys	_ssig, INTR, 1
   380                              <1> 
   381                              <1> 
   382                              <1> 
   383                              <1> 
   384                              <1>  %if %0 >= 2
   385 00000142 BB02000000          <1>  mov ebx, %2
   386                              <1>  %if %0 >= 3
   387 00000147 B901000000          <1>  mov ecx, %3
   388                              <1>  %if %0 = 4
   389                              <1>  mov edx, %4
   390                              <1>  %endif
   391                              <1>  %endif
   392                              <1>  %endif
   393 0000014C B828000000          <1>  mov eax, %1
   394 00000151 CD30                <1>  int 30h
   395                                  		; eax = return value
   396 00000153 29D2                    	sub	edx, edx ; 0
   397 00000155 3915[38110000]          	cmp	dword [arginp], edx ; 0
   398 0000015B 7608                    	jna	short _11
   399 0000015D 3815[3C110000]          	cmp	byte [onelflg], dl ; 0
   400 00000163 7404                    	je	short _12
   401                                  _11:
   402 00000165 A801                    	test	al, 1
   403 00000167 7506                    	jnz	short _13
   404                                  _12:
   405 00000169 FE05[3D110000]          	inc 	byte [setintr]
   406                                  _13: 	
   407 0000016F 8B4500                  	mov	eax, [ebp] ; argument count
   408 00000172 48                      	dec	eax ; dolc = c-1
   409 00000173 A3[28110000]            	mov	[dolc], eax
   410                                  	;
   411 00000178 09C0                    	or	eax, eax
   412 0000017A 7404                    	jz	short _13x
   413                                  	;
   414 0000017C 8B442408                	mov	eax, [esp+8] ; pointer to argument 1
   415                                  _13x:
   416 00000180 A3[2C110000]            	mov	[dolv], eax ; dolv = v+1
   417                                  
   418                                  	;; 10/12/2015
   419                                  	; save esp for ESCAPE/CANCEL
   420 00000185 8925[2C170000]          	mov	[esc_esp], esp 
   421                                  	;;
   422                                  _loop:
   423 0000018B 66833D[990E0000]00      	cmp	word [promp], 0
   424 00000193 760A                    	jna	short _14
   425                                  esc_retn:
   426 00000195 BE[970E0000]            	mov	esi, prompt
   427 0000019A E8E4030000              	call	prs
   428                                  _14:
   429 0000019F E8BC010000              	call	getc
   430 000001A4 A2[3E110000]            	mov	[peekc], al
   431 000001A9 E802000000              	call	main1
   432 000001AE EBDB                    	jmp	short _loop
   433                                  
   434                                  main1:	; main1()
   435 000001B0 C705[44110000]-         	mov	dword [argp], args
   436 000001B6 [44150000]         
   437 000001BA C705[48110000]-         	mov	dword [eargp], args+ARGSIZ-5
   438 000001C0 [71150000]         
   439 000001C4 C705[4C110000]-         	mov	dword [linep], line
   440 000001CA [5C110000]         
   441 000001CE C705[50110000]-         	mov	dword [elinep], line+LINSIZ-5
   442 000001D4 [3F150000]         
   443 000001D8 30C0                    	xor	al, al
   444 000001DA A2[3F110000]            	mov	[error], al ; 0
   445 000001DF A2[40110000]            	mov	[gflg], al ; 0
   446                                  _15:
   447 000001E4 8B35[4C110000]          	mov	esi, [linep]
   448 000001EA E86A000000              	call	_word ; word()	
   449 000001EF 8A06                    	mov	al, [esi]	
   450 000001F1 3C0D                    	cmp	al, 0Dh ; ENTER key (\n)
   451 000001F3 75EF                    	jne	short _15
   452 000001F5 BE[76150000]            	mov	esi, trebuf
   453 000001FA 8935[54110000]          	mov	[treep], esi
   454 00000200 81C690010000            	add	esi, 4*TRESIZ
   455 00000206 8935[58110000]          	mov	[treeend], esi
   456 0000020C 28C0                    	sub	al, al
   457 0000020E 3805[40110000]          	cmp	byte [gflg], al ; 0
   458 00000214 7742                    	ja	short _19
   459 00000216 3805[3F110000]          	cmp	byte [error], al ; 0
   460 0000021C 771C                    	ja	short _17
   461                                  		; Set error return address to _err_retn
   462                                  	; setjmp(jmpbuf) 
   463 0000021E E8490C0000              	call	setexit ; UNIX v6 (on 286) - SH.C
   464                                  _err_retn:
   465 00000223 803D[3F110000]00        	cmp	byte [error], 0
   466 0000022A 772C                    	ja	short _19
   467 0000022C E893030000                      call	syntax ; t = syntax(args, argp);
   468                                  _16:
   469 00000231 803D[3F110000]00        	cmp	byte [error], 0
   470 00000238 7610                    	jna	short _18
   471                                  _17:
   472 0000023A BE[1F0F0000]            	mov 	esi, syntax_err ; "syntax error"
   473 0000023F B8FF000000              	mov	eax, 255 ; exit (error) number
   474 00000244 E801030000              	call	err
   475 00000249 C3                      	retn	
   476                                  _18:
   477 0000024A 29C9                    	sub	ecx, ecx ; 0
   478 0000024C 29D2                    	sub 	edx, edx 
   479 0000024E 42                      	inc	edx 	 ; 1
   480 0000024F 29F6                    	sub	esi, esi ; 0
   481 00000251 89D7                    	mov	edi, edx ; 1
   482                                  	;mov	dword [pf1_0], ecx ; 0
   483                                  	;mov	dword [pf1_1], edx ; 1
   484                                  	;mov	dword [pf2_0], esi ; 0
   485                                  	;mov	dword [pf2_1], edi ; 1
   486                                  	; EAX = t
   487 00000253 E8A5050000              	call	execute ; execute(t);
   488                                  _19:
   489 00000258 C3                      	retn
   490                                  
   491                                  _word:	; word()
   492 00000259 8B3D[44110000]          	mov	edi, [argp]  ; current arg pointer address
   493 0000025F A1[4C110000]            	mov	eax, [linep] ; current arg line address
   494 00000264 AB                      	stosd		     ; argument address in edi 	
   495 00000265 893D[44110000]          	mov	[argp], edi  ; pointer to argument pointer
   496                                  __loop:
   497 0000026B E8F0000000              	call	getc
   498                                  		; switch-case ' \t\'"'
   499 00000270 3C20                    	cmp	al, ' ' ; space
   500 00000272 74F7                    	je	short __loop
   501 00000274 3C09                    	cmp	al, 09h ; \t (tab key)	
   502 00000276 74F3                    	je	short __loop
   503 00000278 3C27                    	cmp	al, "'" ; single quote
   504 0000027A 7404                    	je	short _20
   505 0000027C 3C22                    	cmp	al, '"' ; double quote
   506 0000027E 752C                    	jne	short _23
   507                                  _20:
   508 00000280 88C4                    	mov	ah, al
   509                                  _21:
   510 00000282 E8DE010000              	call 	readc
   511 00000287 38E0                    	cmp	al, ah
   512 00000289 743F                    	je	short pack
   513 0000028B 3C0D                    	cmp	al, 0Dh ; \n (Carriage Return)
   514 0000028D 750C                    	jne	short _22
   515 0000028F FE05[3F110000]          	inc	byte [error]
   516 00000295 A2[3E110000]            	mov	[peekc], al
   517 0000029A C3                      	retn
   518                                  _22:
   519 0000029B 8B3D[4C110000]          	mov 	edi, [linep]
   520 000002A1 0C80                    	or	al, QUOTE
   521 000002A3 AA                      	stosb
   522 000002A4 893D[4C110000]          	mov	[linep], edi
   523 000002AA EBD6                    	jmp	short _21
   524                                  _23:
   525 000002AC E85B000000              	call	anyc1	; switch-case "&;<>()|^\n"
   526 000002B1 7512                    	jne	short _25
   527                                  _24:
   528 000002B3 8B3D[4C110000]          	mov	edi, [linep] ; argument line address
   529 000002B9 AA                      	stosb
   530 000002BA C60700                  	mov	byte [edi], 0 ; \0 (string terminator)
   531 000002BD 47                      	inc 	edi
   532 000002BE 893D[4C110000]          	mov	[linep], edi
   533 000002C4 C3                      	retn	
   534                                  _25:
   535 000002C5 A2[3E110000]            	mov	[peekc], al
   536                                  
   537                                  pack: 
   538 000002CA E891000000              	call	getc  ; c = getc()
   539 000002CF E828000000              	call	anyc0 ; any(c, " '\"\t;&<>()|^\n")
   540 000002D4 7517                    	jne	short _26
   541 000002D6 A2[3E110000]            	mov	[peekc], al ; peekc = c;
   542                                  			; any(c, "\"'") 
   543 000002DB 3C22                    	cmp 	al, '"'	; Double quote
   544 000002DD 748C                    	je	short __loop
   545 000002DF 3C27                    	cmp 	al, "'"	; Single quote
   546 000002E1 7488                    	je	short __loop
   547                                  
   548                                  			; *linep++ = '\0';
   549 000002E3 8B3D[4C110000]          	mov 	edi, [linep]
   550 000002E9 C60700                  	mov	byte [edi], 0
   551 000002EC C3                      	retn
   552                                  _26:
   553 000002ED 8B3D[4C110000]          	mov 	edi, [linep]
   554 000002F3 AA                      	stosb
   555 000002F4 893D[4C110000]          	mov	[linep], edi
   556 000002FA EBCE                    	jmp	short pack
   557                                  
   558                                  anyc0:
   559 000002FC 3C20                    	cmp 	al, ' '	; Space
   560 000002FE 742E                    	je	short anyc2
   561 00000300 3C27                    	cmp 	al, "'"	; Single quote
   562 00000302 742A                    	je	short anyc2
   563 00000304 3C22                    	cmp 	al, '"'	; Double quote
   564 00000306 7426                    	je	short anyc2
   565 00000308 3C09                    	cmp 	al, 09h ; \t (Tab)
   566 0000030A 7422                    	je	short anyc2
   567                                  anyc1:
   568 0000030C 3C26                    	cmp 	al, '&'
   569 0000030E 741E                    	je	short anyc2
   570 00000310 3C3B                    	cmp 	al, ';'
   571 00000312 741A                    	je	short anyc2
   572 00000314 3C3C                    	cmp 	al, '<'
   573 00000316 7416                    	je	short anyc2
   574 00000318 3C3E                    	cmp 	al, '>'
   575 0000031A 7412                    	je	short anyc2
   576 0000031C 3C28                    	cmp 	al, '('
   577 0000031E 740E                    	je	short anyc2
   578 00000320 3C29                    	cmp 	al, ')'
   579 00000322 740A                    	je	short anyc2
   580 00000324 3C7C                    	cmp 	al, '|'
   581 00000326 7406                    	je	short anyc2
   582 00000328 3C5E                    	cmp 	al, '^'
   583 0000032A 7402                    	je	short anyc2
   584 0000032C 3C0D                    	cmp 	al, 0Dh ; \n (Carriage Return, ENTER key)
   585                                  anyc2:
   586 0000032E C3                      	retn
   587                                  
   588                                  tree:	; tree(n)
   589                                  	;
   590                                  	; AL = n
   591                                  		; t = treep;
   592                                  		; treep =+ n;
   593                                  	;shl	al, 2 ; 4*n
   594 0000032F 0FB6D8                  	movzx	ebx, al
   595 00000332 66C1E302                	shl	bx, 2 ; 4*n
   596 00000336 031D[54110000]          	add	ebx, [treep]
   597 0000033C 3B1D[58110000]          	cmp	ebx, [treeend] ; if (treep>treeend)
   598 00000342 7615                    	jna	short _27
   599 00000344 BE[2E0F0000]            	mov	esi, cmdl_overflow ; "Command line overflow\n"
   600 00000349 E835020000              	call	prs
   601 0000034E FE05[3F110000]          	inc	byte [error] ; error++;
   602                                  	; longjmp(jmpbuf, 1)
   603 00000354 E91A0B0000                      jmp     reset ; UNIX v6 (on 286) - SH.C 
   604                                  _27:
   605 00000359 871D[54110000]          	xchg	[treep], ebx
   606 0000035F C3                      	retn	; return(t)
   607                                  
   608                                  getc:	; getc()
   609                                  	
   610 00000360 803D[3E110000]00        	cmp 	byte [peekc], 0
   611 00000367 7609                    	jna 	short _28
   612 00000369 28C0                    	sub	al, al ; 0
   613 0000036B 8605[3E110000]          	xchg	al, [peekc]
   614 00000371 C3                      	retn
   615                                  _28:
   616 00000372 8B1D[44110000]          	mov	ebx, [argp]
   617 00000378 3B1D[48110000]          	cmp	ebx, [eargp]
   618 0000037E 762D                    	jna	short _30
   619 00000380 832D[44110000]0A        	sub 	dword [argp], 10
   620                                  _29:		; while((c=getc()) != '\n')
   621 00000387 E8D4FFFFFF              	call	getc
   622 0000038C 3C0D                    	cmp	al, 0Dh ; \n
   623 0000038E 75F7                    	jne	short _29
   624 00000390 8305[44110000]0A        	add 	dword [argp], 10
   625 00000397 BE[480F0000]            	mov 	esi, many_args_err
   626 0000039C B8FF000000              	mov	eax, 255 ; exit (error) number
   627 000003A1 E8A4010000              	call	err ; err("Too many args",255)
   628 000003A6 FE05[40110000]          	inc	byte [gflg]
   629 000003AC C3                      	retn	; return(c)
   630                                  
   631                                  _30:
   632 000003AD 8B15[4C110000]          	mov	edx, [linep]
   633 000003B3 3B15[50110000]          	cmp	edx, [elinep]
   634 000003B9 762D                    	jna	short getd
   635 000003BB 832D[4C110000]0A        	sub 	dword [linep], 10
   636                                  _31:		; while((c=getc()) != '\n')
   637 000003C2 E899FFFFFF              	call	getc
   638 000003C7 3C0D                    	cmp	al, 0Dh ; \n
   639 000003C9 75BC                    	jne	short _29
   640 000003CB 8305[4C110000]0A        	add 	dword [linep], 10
   641 000003D2 BE[580F0000]            	mov 	esi, many_chars_err
   642 000003D7 B8FF000000              	mov	eax, 255
   643 000003DC E869010000              	call	err ; err("Too many characters",255)
   644 000003E1 FE05[40110000]          	inc	byte [gflg]
   645 000003E7 C3                      	retn	
   646                                  getd:
   647 000003E8 8B1D[24110000]          	mov	ebx, [dolp]
   648 000003EE 21DB                    	and	ebx, ebx
   649 000003F0 7416                    	jz	short _33
   650 000003F2 8A03                    	mov	al, [ebx]
   651 000003F4 08C0                    	or	al, al
   652 000003F6 7407                    	jz	short _32
   653 000003F8 FE05[24110000]          	inc	byte [dolp]
   654 000003FE C3                      	retn	; return(c)
   655                                  _32:	
   656 000003FF 29DB                    	sub	ebx, ebx ; 0
   657 00000401 891D[24110000]          	mov	[dolp], ebx
   658 00000407 C3                      	retn
   659                                  _33:
   660 00000408 E858000000              	call	readc ; c = readc() 
   661 0000040D 3C5C                    	cmp	al, '\'
   662 0000040F 750F                    	jne	short _35
   663 00000411 E84F000000              	call	readc
   664 00000416 3C0D                    	cmp	al, 0Dh ; \n
   665 00000418 7503                    	jne	short _34
   666 0000041A B020                    	mov	al, ' ' ; 20h, space
   667 0000041C C3                      	retn
   668                                  _34:
   669 0000041D 0C80                    	or	al, QUOTE
   670 0000041F C3                      	retn
   671                                  _35:	
   672 00000420 3C24                    	cmp	al, '$'
   673 00000422 753E                    	jne	short _37
   674 00000424 E83C000000              	call	readc
   675 00000429 3C30                    	cmp	al, '0' ; '$0'
   676 0000042B 7224                    	jb	short _36
   677 0000042D 3C39                    	cmp	al, '9' ; '$9'
   678 0000042F 7720                    	ja	short _36
   679 00000431 2C30                    	sub	al, '0'
   680 00000433 0FB6D8                  	movzx	ebx, al
   681 00000436 3B1D[28110000]          	cmp	ebx, [dolc]
   682 0000043C 73AA                    	jnb	short getd
   683 0000043E C0E302                  	shl	bl, 2 ; 4 * al (0 to 9)
   684 00000441 031D[2C110000]          	add	ebx, [dolv]
   685 00000447 8B13                    	mov	edx, [ebx]
   686 00000449 8915[24110000]          	mov	[dolp], edx
   687 0000044F EB97                    	jmp	short getd
   688                                  _36:
   689 00000451 3C24                    	cmp	al, '$'
   690 00000453 750D                    	jne	short _37
   691 00000455 BA[30110000]            	mov	edx, pidp
   692 0000045A 8915[24110000]          	mov	[dolp], edx
   693 00000460 EB86                    	jmp	short getd
   694                                  _37:
   695 00000462 247F                    	and	al, 7Fh
   696 00000464 C3                      	retn
   697                                  
   698                                  readc:	; readc()
   699 00000465 8B1D[38110000]          	mov	ebx, [arginp]
   700 0000046B 21DB                    	and	ebx, ebx ; 0 ?
   701 0000046D 742E                    	jz	short _42
   702 0000046F 4B                      	dec	ebx      ; 1 ?
   703 00000470 750F                    	jnz	short _40
   704                                  _38:
   705 00000472 8A1D[37110000]          	mov	bl, [errval]
   706                                  _39:
   707                                  	; ebx = return code (error code)
   708                                  	sys	_exit, ebx
   709                              <1> 
   710                              <1> 
   711                              <1> 
   712                              <1> 
   713                              <1>  %if %0 >= 2
   714 00000478 89DB                <1>  mov ebx, %2
   715                              <1>  %if %0 >= 3
   716                              <1>  mov ecx, %3
   717                              <1>  %if %0 = 4
   718                              <1>  mov edx, %4
   719                              <1>  %endif
   720                              <1>  %endif
   721                              <1>  %endif
   722 0000047A B801000000          <1>  mov eax, %1
   723 0000047F CD30                <1>  int 30h
   724                                  	; xxx !!!
   725                                  _40:
   726 00000481 43                      	inc 	ebx
   727 00000482 8A03                    	mov	al, [ebx] 	
   728 00000484 08C0                    	or	al, al
   729 00000486 750D                    	jnz	short _41
   730 00000488 C705[38110000]0100-     	mov	dword [arginp], 1
   731 00000490 0000               
   732 00000492 B00D                    	mov	al, 0Dh ; \n (Carriage Return)
   733 00000494 C3                      	retn	
   734                                  _41:
   735 00000495 43                      	inc 	ebx
   736 00000496 891D[38110000]          	mov	[arginp], ebx
   737 0000049C C3                      	retn
   738                                  _42:
   739 0000049D 89DA                    	mov 	edx, ebx ; 0
   740 0000049F FEC2                    	inc	dl ; 1
   741 000004A1 3815[3C110000]          	cmp	[onelflg], dl ; 1 ?
   742 000004A7 7504                    	jne	short _44
   743                                  _43:
   744 000004A9 FECB                    	dec	bl ; 255
   745                                  	; ebx = return code (error code)
   746 000004AB EBCB                    	jmp	short _39
   747                                  _44:
   748 000004AD B9[35110000]            	mov	ecx, cc
   749                                  	;sys	_read, 0, cc, edx
   750                                  	sys	_read  ; read 1 byte from stdin
   751                              <1> 
   752                              <1> 
   753                              <1> 
   754                              <1> 
   755                              <1>  %if %0 >= 2
   756                              <1>  mov ebx, %2
   757                              <1>  %if %0 >= 3
   758                              <1>  mov ecx, %3
   759                              <1>  %if %0 = 4
   760                              <1>  mov edx, %4
   761                              <1>  %endif
   762                              <1>  %endif
   763                              <1>  %endif
   764 000004B2 B803000000          <1>  mov eax, %1
   765 000004B7 CD30                <1>  int 30h
   766 000004B9 72EE                    	jc	short _43
   767 000004BB 39D0                    	cmp	eax, edx ; 1 byte ?
   768 000004BD 72B3                    	jb	short _38 ; end of file
   769 000004BF A0[35110000]            	mov	al, [cc]
   770                                  	;
   771                                  	;; 10/12/2015
   772 000004C4 E817000000              	call	printchr
   773                                  	;;
   774 000004C9 3C0D                    	cmp	al, 0Dh  ; \n	
   775 000004CB 750E                    	jne	short _45
   776 000004CD 3815[3C110000]          	cmp	[onelflg], dl ; 1 ?
   777 000004D3 7206                    	jb	short _45
   778 000004D5 FE0D[3C110000]          	dec	byte [onelflg]
   779                                  _45:
   780 000004DB C3                      	retn
   781                                  _46:
   782 000004DC FECB                    	dec	bl	; 255 ; error code
   783 000004DE EB(27)                  	jmp	short 39
   784                                  
   785                                  printchr:
   786                                  	; 10/12/2015
   787 000004E0 66833D[990E0000]00              cmp     word [promp], 0
   788 000004E8 764B                            jna     short prchr5
   789                                  prchr0:
   790                                  	; check for printable chars
   791 000004EA 3C20                    	cmp	al, 32 ; 20h
   792 000004EC 7321                    	jnb	short prchr2
   793                                  	;
   794 000004EE 3C08                    	cmp	al, 08h  ; BACKSPACE
   795 000004F0 7427                    	je	short prchr3
   796                                  	;
   797 000004F2 3C1B                    	cmp	al, 1Bh ; ESCAPE !
   798 000004F4 740E                    	je	short prchr1
   799                                  	;
   800 000004F6 3C0D                    	cmp	al, 0Dh	; CR/ENTER key
   801 000004F8 753A                            jne     short prchr4 ; retn
   802                                  	; CARRIAGE RETURN & LINE FEED
   803 000004FA 6650                    	push	ax
   804 000004FC E840000000              	call	crlf
   805 00000501 6658                    	pop	ax ; al = ODh (again)
   806 00000503 C3                      	retn
   807                                  prchr1:
   808                                  	; restore esp and cancel typing/command
   809                                  	; 10/12/2015
   810 00000504 8B25[2C170000]          	mov	esp, [esc_esp]
   811 0000050A E986FCFFFF                      jmp     esc_retn
   812                                  prchr2:
   813 0000050F 3C7E                    	cmp	al, 126 ; 7Eh
   814 00000511 7606                    	jna	short prchr3
   815                                  	;	
   816 00000513 3C7F                    	cmp	al, 127 ; (DELETE)
   817 00000515 751D                            jne     short prchr4  ; retn
   818 00000517 B008                    	mov	al, 08h ; BACKPACE
   819                                  _echo:
   820                                  prchr3:
   821 00000519 A2[35110000]            	mov	[cc], al
   822                                  	sys	_write, 1, cc, 1 ; write char to stdout
   823                              <1> 
   824                              <1> 
   825                              <1> 
   826                              <1> 
   827                              <1>  %if %0 >= 2
   828 0000051E BB01000000          <1>  mov ebx, %2
   829                              <1>  %if %0 >= 3
   830 00000523 B9[35110000]        <1>  mov ecx, %3
   831                              <1>  %if %0 = 4
   832 00000528 BA01000000          <1>  mov edx, %4
   833                              <1>  %endif
   834                              <1>  %endif
   835                              <1>  %endif
   836 0000052D B804000000          <1>  mov eax, %1
   837 00000532 CD30                <1>  int 30h
   838                                  prchr4:
   839 00000534 C3                      	retn
   840                                  prchr5:
   841 00000535 803D[30170000]00        	cmp	byte [echo], 0
   842 0000053C 77AC                    	ja	short prchr0
   843 0000053E C3                      	retn
   844                                  
   845                                  newline:
   846                                  	; 10/12/2015
   847 0000053F B00D                    	mov	al, 0Dh
   848                                  crlf:
   849 00000541 E8D3FFFFFF              	call	_echo
   850 00000546 B00A                    	mov	al, 0Ah
   851 00000548 EBCF                    	jmp	_echo
   852                                  
   853                                  
   854                                  err:	; err(s, exitno)
   855                                  	
   856                                  	; esi = error message address
   857                                  	; eax = error code (number)
   858                                  	
   859 0000054A 50                      	push	eax
   860 0000054B E833000000              	call	prs
   861 00000550 BE[450F0000]            	mov	esi, nl ; next line
   862 00000555 E829000000              	call	prs
   863 0000055A 66833D[990E0000]00      	cmp	word [promp], 0
   864 00000562 771E                    	ja	short _47 ; retn
   865                                  	sys 	_seek, 0, 0, 2 ; move file ptr to EOF
   866                              <1> 
   867                              <1> 
   868                              <1> 
   869                              <1> 
   870                              <1>  %if %0 >= 2
   871 00000564 BB00000000          <1>  mov ebx, %2
   872                              <1>  %if %0 >= 3
   873 00000569 B900000000          <1>  mov ecx, %3
   874                              <1>  %if %0 = 4
   875 0000056E BA02000000          <1>  mov edx, %4
   876                              <1>  %endif
   877                              <1>  %endif
   878                              <1>  %endif
   879 00000573 B813000000          <1>  mov eax, %1
   880 00000578 CD30                <1>  int 30h
   881 0000057A 5B                      	pop	ebx ; error code
   882                                  	sys	_exit
   883                              <1> 
   884                              <1> 
   885                              <1> 
   886                              <1> 
   887                              <1>  %if %0 >= 2
   888                              <1>  mov ebx, %2
   889                              <1>  %if %0 >= 3
   890                              <1>  mov ecx, %3
   891                              <1>  %if %0 = 4
   892                              <1>  mov edx, %4
   893                              <1>  %endif
   894                              <1>  %endif
   895                              <1>  %endif
   896 0000057B B801000000          <1>  mov eax, %1
   897 00000580 CD30                <1>  int 30h
   898                                  	; xxx !!!
   899                                  _47:
   900 00000582 C3                      	retn
   901                                  
   902                                  prs:	; prs(as)
   903                                  
   904                                  	; esi = ASCIIZ string (text) address
   905                                  
   906 00000583 AC                      	lodsb
   907 00000584 20C0                    	and	al, al
   908 00000586 7407                    	jz	short _48
   909 00000588 E803000000              	call	putc
   910 0000058D EBF4                    	jmp	short prs
   911                                  _48:
   912 0000058F C3                      	retn
   913                                  
   914                                  putc:	; putc(c)
   915 00000590 A2[35110000]            	mov 	[cc], al
   916                                  	sys	_write, 2, cc, 1 ; write char to stderr
   917                              <1> 
   918                              <1> 
   919                              <1> 
   920                              <1> 
   921                              <1>  %if %0 >= 2
   922 00000595 BB02000000          <1>  mov ebx, %2
   923                              <1>  %if %0 >= 3
   924 0000059A B9[35110000]        <1>  mov ecx, %3
   925                              <1>  %if %0 = 4
   926 0000059F BA01000000          <1>  mov edx, %4
   927                              <1>  %endif
   928                              <1>  %endif
   929                              <1>  %endif
   930 000005A4 B804000000          <1>  mov eax, %1
   931 000005A9 CD30                <1>  int 30h
   932 000005AB C3                      	retn
   933                                  
   934                                  
   935                                  prn:	; prn(n)
   936                                  
   937 000005AC B90A000000              	mov	ecx, 10
   938                                  _49:	
   939 000005B1 31D2                    	xor	edx, edx ; 0
   940 000005B3 F7F1                    	div	ecx 	 ; (edx:eax) / ecx
   941                                  			 ; eax = quotient, edx = remainder
   942 000005B5 92                      	xchg 	eax, edx ; quotient in EDX (n/10)
   943                                  			 ; remainder in EAX (n%10)
   944 000005B6 0430                    	add	al, '0'
   945 000005B8 E8D3FFFFFF              	call	putc
   946 000005BD 89D0                    	mov	eax, edx
   947 000005BF 09C0                    	or	eax, eax
   948 000005C1 75EE                    	jnz	short _49
   949 000005C3 C3                      	retn
   950                                  
   951                                  ;/*
   952                                  ; * syntax
   953                                  ; *	empty
   954                                  ; *	syn1
   955                                  ; */
   956                                  
   957                                  syntax: ; syntax(args, argp)
   958                                  	;
   959                                  	; syntax(p1, p2)
   960                                  	; char **p1, **p2;
   961                                  	; {
   962                                  	;
   963                                  	;	while(p1 != p2) {
   964                                  	;		if(any(**p1, ";&\n"))
   965                                  	;			p1++; else
   966                                  	;			return(syn1(p1, p2));
   967                                  	;	}
   968                                  	;	return(0);
   969                                  	; }
   970                                  	;
   971                                  
   972 000005C4 BE[44150000]            	mov	esi, args   ; p1
   973 000005C9 8B3D[44110000]          	mov 	edi, [argp] ; p2
   974                                  syn0:
   975 000005CF 39FE                    	cmp	esi, edi ; while(p1 != p2)
   976 000005D1 0F8387000000                    jnb     _54
   977                                  
   978 000005D7 8A06                    	mov 	al, [esi] 
   979                                  
   980                                  anyc3:	; if(any(**p1, ";&\n"))
   981 000005D9 3C3B                    	cmp 	al, ';'
   982 000005DB 7408                    	je	short anyc4
   983 000005DD 3C26                    	cmp 	al, '&'
   984 000005DF 7404                    	je	short anyc4
   985 000005E1 3C0D                    	cmp 	al, 0Dh ; \n
   986 000005E3 7503                    	jne	short syn1 ; else
   987                                  			   ; return(syn1(p1, p2));
   988                                  anyc4:
   989 000005E5 46                      	inc	esi
   990 000005E6 EBE7                    	jmp	short syn0
   991                                  
   992                                  
   993                                  ;/*
   994                                  ; * syn1
   995                                  ; *	syn2
   996                                  ; *	syn2 & syntax
   997                                  ; *	syn2 ; syntax
   998                                  ; */
   999                                  
  1000                                  syn1:	; syn1(p1, p2)
  1001                                  
  1002 000005E8 B100                    	mov 	cl, 0 ; l = 0
  1003                                  
  1004 000005EA 8935[08170000]          	mov	[p1], esi ; *p
  1005 000005F0 893D[0C170000]          	mov	[p2], edi
  1006                                  
  1007                                  	; mov 	al, [esi] ; **p
  1008                                  
  1009                                  _50:	; switch(**p) {
  1010 000005F6 3C28                    	cmp	al, '(' ; case '(':
  1011 000005F8 7467                    	je	short _55
  1012 000005FA 3C29                    	cmp	al, ')' ; case ')':
  1013 000005FC 7467                    	je	short _56
  1014 000005FE 3C26                    	cmp	al, '&' ; case '&':
  1015 00000600 7408                            je      short _51
  1016 00000602 3C3B                    	cmp	al, ';' ; case ';':
  1017 00000604 7404                            je      short _51
  1018 00000606 3C0D                    	cmp	al, 0Dh ; case '\n':
  1019 00000608 755F                    	jne	short _57
  1020                                  _51:
  1021 0000060A 08C9                    	or	cl, cl ; if(l == 0)
  1022 0000060C 755B                    	jnz	short _57
  1023 0000060E 88C1                    	mov	cl, al ; l = **p;
  1024 00000610 B004                    	mov	al, 4  ; t = tree(4); 
  1025 00000612 E818FDFFFF              	call	tree
  1026                                  		; EBX = t
  1027 00000617 C70304000000            	mov	dword [ebx+DTYP], TLST ; t[DTYP] = TLST
  1028 0000061D 89F7                    	mov	edi, esi ; p
  1029 0000061F 56                      	push	esi
  1030 00000620 8B35[08170000]          	mov 	esi, [p1] ; p1
  1031 00000626 6651                    	push	cx
  1032 00000628 53                      	push	ebx
  1033 00000629 E848000000              	call	syn2 ; syn2(p1, p)
  1034 0000062E 5A                      	pop	edx
  1035 0000062F 894204                  	mov	[edx+DLEF], eax ; t[DLEF] = syn2(p1, p);
  1036 00000632 C7420C00000000          	mov	dword [edx+DFLG], 0 ; t[DFLG] = 0;
  1037 00000639 6659                    	pop	cx
  1038 0000063B 80F926                  	cmp	cl, '&' ; if(l == '&')
  1039 0000063E 7507                    	jne	short _52
  1040                                  		; t1 = t[DLEF];
  1041                                  		; t1[DFLG] =| FAND|FPRS|FINT;
  1042 00000640 C7400C61000000          	mov	dword [eax+DFLG], FAND+FPRS+FINT
  1043                                  _52:
  1044 00000647 5E                      	pop	esi
  1045 00000648 8B3D[0C170000]          	mov	edi, [p2]
  1046 0000064E 46                      	inc	esi
  1047 0000064F 52                      	push	edx
  1048 00000650 E87AFFFFFF              	call	syn0 	; syntax(p+1, p2);
  1049 00000655 5A                      	pop	edx
  1050                                  	
  1051                                  	;mov	[edx+DRIT], eax ; t[DRIT] = syntax(p+1, p2);
  1052                                  	;; return(t);
  1053                                  	;mov	eax, edx
  1054                                  	;retn
  1055                                  	
  1056 00000656 EB69                    	jmp	short _61	
  1057                                  _53:
  1058 00000658 FE05[3F110000]          	inc 	byte [error] ; error++;
  1059                                  _54:
  1060                                  	; return(0);
  1061 0000065E 31C0                    	xor	eax, eax
  1062 00000660 C3                      	retn
  1063                                  _55:
  1064 00000661 FEC1                    	inc	cl ; l++;
  1065 00000663 EB04                    	jmp	short _57 ; continue;
  1066                                  _56:
  1067 00000665 FEC9                    	dec	cl ; l--;
  1068 00000667 78EF                    	js	short _53 ; if(l < 0)
  1069                                  _57:
  1070                                  	; for(p=p1; p!=p2; p++)
  1071 00000669 39FE                    	cmp	esi, edi
  1072 0000066B 7305                    	jnb	short _58
  1073 0000066D 46                      	inc	esi
  1074 0000066E 8A06                    	mov 	al, [esi]	
  1075 00000670 EB84                    	jmp	short _50
  1076                                  _58:
  1077 00000672 20C9                    	and 	cl, cl ; if(l == 0)
  1078 00000674 75E2                    	jnz	short _53
  1079                                  	;jmp	short syn2 ; return(syn2(p1, p2));
  1080                                  
  1081                                  ;/*
  1082                                  ; * syn2
  1083                                  ; *	syn3
  1084                                  ; *	syn3 | syn2
  1085                                  ; */
  1086                                  
  1087                                  syn2:	; syn2(p1, p2)
  1088                                  
  1089 00000676 B100                    	mov 	cl, 0 ; l = 0
  1090                                  
  1091 00000678 57                      	push	edi ; p2
  1092 00000679 56                      	push	esi ; p1, p
  1093                                  _59:
  1094 0000067A 39FE                    	cmp	esi, edi  ; for(p=p1; p!=p2; p++)
  1095 0000067C 7351                    	jnb	short _64
  1096                                  
  1097 0000067E AC                      	lodsb	; mov al, [esi]
  1098                                  		; inc esi
  1099                                  	
  1100                                  	; switch(**p) {
  1101 0000067F 3C28                    	cmp	al, '(' ; case '(':
  1102 00000681 7444                    	je	short _62
  1103 00000683 3C29                    	cmp	al, ')' ; case ')':
  1104 00000685 7444                    	je	short _63
  1105 00000687 3C7C                    	cmp	al, '|' ; case '|':
  1106 00000689 7404                            je      short _60
  1107 0000068B 3C5E                    	cmp	al, '^' ; case '^':
  1108 0000068D 75EB                    	jne	short _59
  1109                                  _60:
  1110 0000068F 20C9                    	and	cl, cl ; if(l == 0)
  1111 00000691 75E7                    	jnz	short _59
  1112                                  	
  1113 00000693 B004                    	mov	al, 4  ; t = tree(4); 
  1114 00000695 E895FCFFFF              	call	tree
  1115                                  		; EBX = t
  1116 0000069A C70303000000            	mov	dword [ebx+DTYP], TFIL ; t[DTYP] = TFIL
  1117 000006A0 89F7                    	mov	edi, esi   ; p+1
  1118 000006A2 5E                      	pop	esi  ; p1
  1119 000006A3 5A                      	pop	edx  ; p2
  1120 000006A4 53                      	push	ebx  ; t
  1121 000006A5 57                      	push	edi  ; p+1
  1122 000006A6 52                      	push	edx  ; p2
  1123 000006A7 4F                      	dec	edi  ; p
  1124 000006A8 53                      	push	ebx  ; t
  1125 000006A9 E823000000              	call	syn3 ; syn3(p1, p);
  1126 000006AE 5B                      	pop	ebx  ; t
  1127 000006AF 894304                  	mov	[ebx+DLEF], eax ; t[DLEF] = syn3(p1, p);
  1128 000006B2 5F                      	pop	edi  ; p2
  1129 000006B3 5E                      	pop	esi  ; p+1
  1130 000006B4 E8BDFFFFFF              	call	syn2 ; syn2(p+1, p2);
  1131 000006B9 5A                      	pop	edx  ; t
  1132 000006BA C7420C00000000          	mov	dword [edx+DFLG], 0 ; t[DFLG] = 0;
  1133                                  _61:
  1134 000006C1 894208                  	mov	[edx+DRIT], eax ; t[DRIT] = syn2(p+1, p2);
  1135                                  	; return(t);
  1136 000006C4 89D0                    	mov	eax, edx
  1137 000006C6 C3                      	retn	
  1138                                  _62:
  1139 000006C7 FEC1                    	inc	cl ; l++;
  1140 000006C9 EBAF                    	jmp	short _59 ; continue;
  1141                                  _63:
  1142 000006CB FEC9                    	dec	cl ; l--;
  1143 000006CD EBAB                    	jmp	short _59 ; continue;
  1144                                  _64:
  1145 000006CF 5E                      	pop	esi ; p1
  1146 000006D0 5F                      	pop	edi ; p2
  1147                                  
  1148                                  	;jmp	short syn3 ; return(syn3(p1, p2));
  1149                                  
  1150                                  ;/*
  1151                                  ; * syn3
  1152                                  ; *	( syn1 ) [ < in  ] [ > out ]
  1153                                  ; *	word word* [ < in ] [ > out ]
  1154                                  ; */
  1155                                  
  1156                                  syn3:	; syn3(p1, p2)
  1157                                  
  1158 000006D1 28C9                    	sub 	cl, cl 	 ; l = 0
  1159 000006D3 29DB                    	sub	ebx, ebx ; lp = 0
  1160 000006D5 29D2                    	sub	edx, edx ; rp = 0
  1161 000006D7 29ED                    	sub	ebp, ebp ; n = 0
  1162                                  
  1163 000006D9 880D[10170000]          	mov	[flg], cl ; 0
  1164 000006DF 891D[14170000]          	mov 	[_i], ebx ; 0
  1165 000006E5 8915[18170000]          	mov	[_o], edx ; 0
  1166                                  
  1167 000006EB 57                      	push	edi ; p2
  1168 000006EC 56                      	push	esi ; p1, p
  1169                                  _70:
  1170 000006ED 39FE                    	cmp	esi, edi  ; for(p=p1; p!=p2; p++)
  1171 000006EF 0F839B000000                    jnb     _82
  1172                                  
  1173 000006F5 AC                      	lodsb	; mov al, [esi]
  1174                                  		; inc esi
  1175                                  
  1176                                  	; switch(c = **p) {
  1177 000006F6 88C5                    	mov	ch, al ; c
  1178 000006F8 3C28                    	cmp	al, '(' ; case '(':
  1179 000006FA 750E                    	jne	short _72
  1180 000006FC 08C9                    	or	cl, cl ; if(l == 0)
  1181 000006FE 7506                    	jnz	short _71
  1182 00000700 21DB                    	and	ebx, ebx ; if (lp != 0)
  1183 00000702 756D                    	jnz	short _79 ; error++;
  1184 00000704 89F3                    	mov	ebx, esi ; lp = p+1;	
  1185                                  _71:
  1186 00000706 FEC1                    	inc	cl ; l++;
  1187 00000708 EBE3                    	jmp 	short _70 ; continue;
  1188                                  _72:
  1189 0000070A 3C29                    	cmp	al, ')' ; case ')':
  1190 0000070C 7509                    	jne	short _73
  1191 0000070E FEC9                    	dec	cl ; l--;
  1192 00000710 75DB                    	jnz	short _70 ; if(l == 0)
  1193 00000712 89F2                    	mov	edx, esi ; p+1
  1194 00000714 4A                      	dec	edx	 ; rp = p;
  1195 00000715 EBD6                    	jmp	short _70	
  1196                                  _73:
  1197 00000717 3C3E                    	cmp	al, '>' ; case '>':
  1198 00000719 7514                    	jne	short _74
  1199                                  		; if(p!=p2 && **p=='>')
  1200 0000071B 39FE                    	cmp	esi, edi
  1201 0000071D 7314                    	jnb	short _75
  1202 0000071F 8A06                    	mov	al, [esi]
  1203 00000721 3C3E                    	cmp	al, '>'
  1204 00000723 750E                    	jne	short _75
  1205 00000725 46                      	inc	esi
  1206 00000726 800D[10170000]02        	or 	byte [flg], FCAT
  1207 0000072D EB04                    	jmp	short _75
  1208                                  _74:
  1209 0000072F 3C3C                    	cmp	al, '<' ; case '<':
  1210 00000731 7549                    	jne	short _81
  1211                                  _75:
  1212 00000733 20C9                    	and	cl, cl ; if(l == 0)
  1213 00000735 75B6                    	jnz	short _70 ; continue;
  1214 00000737 39FE                    	cmp	esi, edi ; if(p == p2)
  1215 00000739 7336                    	jnb	short _79
  1216                                  _76: 
  1217 0000073B 8A06                    	mov	al, [esi] ; p++; p--;
  1218                                  		; if(any(**p, "<>("))
  1219 0000073D 3C3C                    	cmp	al, '<'
  1220 0000073F 7430                    	je	short _79
  1221 00000741 3C3E                    	cmp	al, '>'
  1222 00000743 742C                    	je	short _79
  1223 00000745 3C28                    	cmp	al, '('
  1224 00000747 7428                    	je	short _79
  1225                                  	;
  1226 00000749 31C0                    	xor	eax, eax
  1227 0000074B 80FD3C                  	cmp	ch, '<' ; if(c == '<')
  1228 0000074E 7511                    	jne	short _78
  1229 00000750 3905[14170000]          	cmp	[_i], eax ; 0
  1230 00000756 771B                    	ja	short _80 ; error++;
  1231 00000758 8935[14170000]          	mov	[_i], esi ; i = *p;
  1232                                  _77:
  1233 0000075E 46                      	inc 	esi ; p++;
  1234 0000075F EB8C                    	jmp 	short _70 ; continue;
  1235                                  _78:
  1236 00000761 3905[18170000]          	cmp	[_o], eax ; 0
  1237 00000767 770A                    	ja	short _80 ; error++;
  1238 00000769 8935[18170000]          	mov	[_o], esi ; o = *p;
  1239 0000076F EBED                    	jmp	short _77
  1240                                  _79:
  1241 00000771 29C0                    	sub	eax, eax
  1242                                  _80:
  1243 00000773 FE05[3F110000]          	inc 	byte [error] ; error++;
  1244 00000779 5E                      	pop	esi
  1245 0000077A 5F                      	pop	edi
  1246 0000077B C3                      	retn
  1247                                  _81:
  1248                                  	; default:
  1249 0000077C 08C9                    	or	cl, cl ; if(l == 0)
  1250 0000077E 0F8569FFFFFF                    jnz     _70
  1251 00000784 8B0424                  	mov	eax, [esp]
  1252 00000787 893428                  	mov	[eax+ebp], esi ; p1[n++] = *p;
  1253 0000078A 45                      	inc	ebp
  1254 0000078B E95DFFFFFF                      jmp     _70
  1255                                  _82:
  1256 00000790 5E                      	pop	esi ; p1
  1257 00000791 5F                      	pop	edi ; p2
  1258 00000792 21DB                    	and	ebx, ebx ; if(lp != 0)
  1259 00000794 7421                    	jz	short _83
  1260 00000796 21ED                    	and	ebp, ebp ; if(n != 0)
  1261 00000798 75D9                    	jnz	short short _80 ; error++;
  1262                                  	;
  1263 0000079A 52                      	push	edx ; rp
  1264 0000079B 53                      	push	ebx ; lp
  1265 0000079C B005                    	mov	al, 5
  1266 0000079E E88CFBFFFF              	call	tree  ; t = tree(5); 
  1267                                  		; EBX = t
  1268 000007A3 C70302000000            	mov 	dword [ebx+DTYP], TPAR ; t[DTYP] = TPAR;	
  1269 000007A9 5E                      	pop	esi ; lp
  1270 000007AA 5F                      	pop	edi ; rp 
  1271 000007AB 53                      	push	ebx ; t
  1272 000007AC E837FEFFFF              	call	syn1  ; t[DSPR] = syn1(lp, rp);
  1273 000007B1 5B                      	pop	ebx ; t	
  1274 000007B2 894310                  	mov 	[ebx+DSPR], eax	
  1275 000007B5 EB29                    	jmp	short _out ; goto out;
  1276                                  _83:
  1277 000007B7 09ED                    	or	ebp, ebp ; if(n == 0)
  1278 000007B9 74B8                    	jz	short _80 ; error++;
  1279 000007BB 8B0424                  	mov	eax, [esp]
  1280 000007BE C7042800000000          	mov	dword [eax+ebp], 0 ; p1[n++] = 0
  1281 000007C5 45                      	inc	ebp
  1282                                  	;
  1283 000007C6 89E8                    	mov	eax, ebp ; n
  1284 000007C8 0405                    	add	al, 5 
  1285 000007CA E860FBFFFF              	call	tree  ; t = tree(n+5); 
  1286                                  		; EBX = t
  1287 000007CF C70301000000            	mov 	dword [ebx+DTYP], TCOM ; t[DTYP] = TCOM;
  1288                                  		; esi = p1
  1289 000007D5 BF14000000              	mov	edi, DCOM ; DCOM
  1290 000007DA 89E9                    	mov	ecx, ebp  ; n	
  1291 000007DC 01DF                    	add	edi, ebx  ; t(l+DCOM), l = 0
  1292                                  _84:	; for(l=0; l<n; l++)
  1293 000007DE F3A5                    	rep 	movsd ; t[l+DCOM] = p1[l]; 
  1294                                  _out:
  1295 000007E0 0FB605[10170000]        	movzx	eax, byte [flg]
  1296 000007E7 89430C                  	mov 	[ebx+DFLG], eax  ; t[DFLG] = flg;
  1297 000007EA A1[14170000]            	mov	eax, [_i]
  1298 000007EF 894304                  	mov 	[ebx+DLEF], eax  ; t[DLEF] = i;
  1299 000007F2 A1[18170000]            	mov	eax, [_o]
  1300 000007F7 894308                  	mov 	[ebx+DRIT], eax  ; t[DRIT] = 0;
  1301 000007FA 89D8                    	mov	eax, ebx ; return(t);
  1302 000007FC C3                      	retn
  1303                                  
  1304                                  
  1305                                  execute: ; execute(t, pf1, pf2)
  1306                                  
  1307 000007FD 09C0                    	or	eax, eax ; if(t != 0)
  1308 000007FF 7453                    	jz	short _87 ; return;
  1309                                  
  1310 00000801 890D[1C170000]          	mov	[pf1_0], ecx ; pf1[0]
  1311 00000807 8915[20170000]          	mov	[pf1_1], edx ; pf1[1]
  1312 0000080D 8935[24170000]          	mov	[pf2_0], esi ; pf2[0]
  1313 00000813 893D[28170000]          	mov	[pf2_1], edi ; pf2[1]
  1314                                  	
  1315 00000819 89C3                    	mov 	ebx, eax ; t
  1316 0000081B 8B03                    	mov	eax, [ebx+DTYP]
  1317                                  	
  1318                                  	; switch(t[DTYP]) {
  1319                                  	
  1320 0000081D 83F801                  	cmp	eax, TCOM ; case TCOM:
  1321 00000820 0F8501010000                    jne     _94
  1322                                  	;
  1323 00000826 8B7B14                  	mov	edi, [ebx+DCOM] ; cp1 = t[DCOM];
  1324                                  _cd: ; 07/12/2015
  1325 00000829 66813F6463              	cmp	word [edi], 'dc'
  1326 0000082E 7538                            jne     short __chdir
  1327 00000830 807F0230                	cmp	byte [edi+2], '0'
  1328 00000834 0F85EB000000                    jne     _93
  1329                                  _85:
  1330 0000083A 83C704                  	add	edi, 4
  1331 0000083D 89FE                    	mov	esi, edi ; t[DCOM+1]
  1332 0000083F 8B37                    	mov	esi, [edi]
  1333 00000841 21F6                    	and	esi, esi
  1334 00000843 7517                    	jnz	short _89
  1335                                  	; err("chdir: arg count",255);
  1336 00000845 BE[6E0F0000]            	mov 	esi, chdir_argcount ; "chdir: arg count"
  1337                                  _86:	
  1338 0000084A B8FF000000              	mov	eax, 255 ; exit (error) number
  1339 0000084F E8F6FCFFFF              	call	err
  1340                                  _87:
  1341 00000854 C3                      	retn	; return;
  1342                                  _88:
  1343                                  	; err("chdir: bad directory",255);
  1344 00000855 BE[810F0000]            	mov 	esi, chdir_baddir ; "chdir: bad directory"
  1345 0000085A EBF8                    	jmp	short _87
  1346                                  _89:
  1347                                  		; ESI points to directory name
  1348                                  	sys	_chdir, esi
  1349                              <1> 
  1350                              <1> 
  1351                              <1> 
  1352                              <1> 
  1353                              <1>  %if %0 >= 2
  1354 0000085C 89F3                <1>  mov ebx, %2
  1355                              <1>  %if %0 >= 3
  1356                              <1>  mov ecx, %3
  1357                              <1>  %if %0 = 4
  1358                              <1>  mov edx, %4
  1359                              <1>  %endif
  1360                              <1>  %endif
  1361                              <1>  %endif
  1362 0000085E B80C000000          <1>  mov eax, %1
  1363 00000863 CD30                <1>  int 30h
  1364 00000865 72EE                    	jc	short _88
  1365 00000867 C3                      	retn
  1366                                  __chdir:
  1367 00000868 BE[A60E0000]            	mov	esi, keyword_chdir
  1368 0000086D E8A7040000              	call	_equal ; if(equal(cp1, "chdir"))
  1369 00000872 74D6                    	jz	short _86 ; equal
  1370                                  _shift:
  1371 00000874 BE[AC0E0000]            	mov	esi, keyword_shift
  1372 00000879 E89B040000              	call	_equal ; if(equal(cp1, "shift"))
  1373 0000087E 7529                    	jnz	short _login ; not equal
  1374 00000880 833D[28110000]01        	cmp	dword [dolc], 1
  1375 00000887 730A                    	jnb	short _90
  1376                                  	; prs("shift: no args\n");
  1377 00000889 BE[980F0000]            	mov 	esi, shift_noargs ; "shift: no args"
  1378                                  	;call 	prs
  1379                                  	;retn
  1380 0000088E E9F0FCFFFF              	jmp	prs
  1381                                  _90:
  1382 00000893 8B35[2C110000]          	mov	esi, [dolv]  ; dolv[0]
  1383 00000899 AD                      	lodsd 
  1384 0000089A 8906                    	mov	[esi], eax   ; dolv[1] = dolv[0];
  1385 0000089C 8935[2C110000]          	mov	[dolv], esi  ; dolv++;
  1386 000008A2 FF0D[28110000]          	dec	dword [dolc] ; dolc--;	
  1387 000008A8 C3                      	retn 	; return;
  1388                                  _login:
  1389 000008A9 BE[B20E0000]            	mov	esi, keyword_login
  1390 000008AE E866040000              	call	_equal ; if(equal(cp1, "login"))
  1391 000008B3 7522                    	jnz	short _newgrp ; not equal
  1392 000008B5 66833D[990E0000]00      	cmp	word [promp], 0
  1393 000008BD 760E                    	jna	short _91
  1394                                  	;
  1395 000008BF BB[C40E0000]            	mov	ebx, loginf ; "/bin/login"
  1396 000008C4 89F9                    	mov	ecx, edi ; t+DCOM
  1397                                  		; execv("/bin/login", t+DCOM);
  1398                                  	sys	_exec 
  1399                              <1> 
  1400                              <1> 
  1401                              <1> 
  1402                              <1> 
  1403                              <1>  %if %0 >= 2
  1404                              <1>  mov ebx, %2
  1405                              <1>  %if %0 >= 3
  1406                              <1>  mov ecx, %3
  1407                              <1>  %if %0 = 4
  1408                              <1>  mov edx, %4
  1409                              <1>  %endif
  1410                              <1>  %endif
  1411                              <1>  %endif
  1412 000008C6 B80B000000          <1>  mov eax, %1
  1413 000008CB CD30                <1>  int 30h
  1414                                  _91:
  1415                                  	; prs("login: cannot execute\n");
  1416 000008CD BE[A90F0000]            	mov 	esi, login_cannotexec ; "login: cannot execute"
  1417                                  	;call 	prs
  1418                                  	;retn
  1419 000008D2 E9ACFCFFFF              	jmp	prs
  1420                                  _newgrp:
  1421 000008D7 BE[B80E0000]            	mov	esi, keyword_newgrp
  1422 000008DC E838040000              	call	_equal ; if(equal(cp1, "newgrp"))
  1423 000008E1 7522                    	jnz	short __wait ; not equal
  1424 000008E3 66833D[990E0000]00      	cmp	word [promp], 0
  1425 000008EB 760E                    	jna	short _92
  1426                                  	;
  1427 000008ED BB[CF0E0000]            	mov	ebx, newgrpf ; "/bin/newgrp"
  1428 000008F2 89F9                    	mov	ecx, edi ; t+DCOM
  1429                                  		; execv("/bin/newgrp", t+DCOM);
  1430                                  	sys	_exec 
  1431                              <1> 
  1432                              <1> 
  1433                              <1> 
  1434                              <1> 
  1435                              <1>  %if %0 >= 2
  1436                              <1>  mov ebx, %2
  1437                              <1>  %if %0 >= 3
  1438                              <1>  mov ecx, %3
  1439                              <1>  %if %0 = 4
  1440                              <1>  mov edx, %4
  1441                              <1>  %endif
  1442                              <1>  %endif
  1443                              <1>  %endif
  1444 000008F4 B80B000000          <1>  mov eax, %1
  1445 000008F9 CD30                <1>  int 30h
  1446                                  _92:
  1447                                  	; prs("newgrp: cannot execute\n");
  1448 000008FB BE[C10F0000]            	mov 	esi, newgrp_cannotexec ; "newgrp: cannot execute"
  1449                                  	;call 	prs
  1450                                  	;retn
  1451 00000900 E97EFCFFFF              	jmp	prs
  1452                                  __wait: 
  1453 00000905 BE[BF0E0000]            	mov	esi, keyword_wait
  1454 0000090A E80A040000              	call	_equal ; if(equal(cp1, "wait"))
  1455 0000090F 7508                    	jnz	short _semicolon ; not equal
  1456 00000911 31FF                    	xor	edi, edi
  1457 00000913 4F                      	dec	edi  ; -1
  1458                                  	;call	pwait
  1459                                  	;retrn
  1460 00000914 E90B040000              	jmp	pwait ; pwait(-1);
  1461                                  _semicolon:
  1462                                  	; if(equal(cp1, ":"))
  1463 00000919 803F3A                  	cmp	byte [edi], ':'
  1464 0000091C 7507                    	jne	short _93
  1465 0000091E 807F0100                	cmp	byte [edi+1], 0
  1466 00000922 7501                    	jne	short _93
  1467 00000924 C3                      	retn 	; return;
  1468                                  _93:
  1469                                  	;mov	eax, [ebx+DTYP]
  1470 00000925 8A03                    	mov	al, [ebx+DTYP]
  1471                                  _94:
  1472 00000927 8B530C                          mov     edx, [ebx+DFLG] ; f = t[DFLG];
  1473                                  	;
  1474 0000092A 83F802                  	cmp	eax, TPAR ; case TPAR:
  1475 0000092D 0F85FD020000                    jne     _118
  1476                                  	;
  1477                                  	;mov	edx, [ebx+DFLG]] ; f = t[DFLG];
  1478 00000933 F7C210000000            	test	edx, FPAR
  1479 00000939 7573                    	jnz	short _101
  1480                                  		; i = fork();
  1481 0000093B 53                      	push	ebx
  1482 0000093C BB[AD090000]            	mov	ebx, _100
  1483                                  	; child process will return to '_100' address
  1484                                  	sys	_fork
  1485                              <1> 
  1486                              <1> 
  1487                              <1> 
  1488                              <1> 
  1489                              <1>  %if %0 >= 2
  1490                              <1>  mov ebx, %2
  1491                              <1>  %if %0 >= 3
  1492                              <1>  mov ecx, %3
  1493                              <1>  %if %0 = 4
  1494                              <1>  mov edx, %4
  1495                              <1>  %endif
  1496                              <1>  %endif
  1497                              <1>  %endif
  1498 00000941 B802000000          <1>  mov eax, %1
  1499 00000946 CD30                <1>  int 30h
  1500 00000948 7310                    	jnc	short _95 ; if(i != 0)
  1501                                  		; if(i == -1)
  1502 0000094A 5B                      	pop	ebx
  1503 0000094B BE[F10F0000]            	mov 	esi, try_again ; "try again"
  1504 00000950 B8FF000000              	mov	eax, 255 ; exit (error) number
  1505                                  	;call	err
  1506                                  	;retn
  1507 00000955 E9F0FBFFFF              	jmp	err
  1508                                  _95:
  1509 0000095A 89C7                    	mov	edi, eax ; i
  1510                                  	; if(i != 0) {
  1511 0000095C F7C204000000            	test	edx, FPIN  ; if((f&FPIN) != 0)
  1512 00000962 741C                    	jz	short _96
  1513                                  	;
  1514                                  	sys	_close, [pf1_0] ; close(pf1[0]);
  1515                              <1> 
  1516                              <1> 
  1517                              <1> 
  1518                              <1> 
  1519                              <1>  %if %0 >= 2
  1520 00000964 8B1D[1C170000]      <1>  mov ebx, %2
  1521                              <1>  %if %0 >= 3
  1522                              <1>  mov ecx, %3
  1523                              <1>  %if %0 = 4
  1524                              <1>  mov edx, %4
  1525                              <1>  %endif
  1526                              <1>  %endif
  1527                              <1>  %endif
  1528 0000096A B806000000          <1>  mov eax, %1
  1529 0000096F CD30                <1>  int 30h
  1530                                          sys     _close, [pf1_1] ; close(pf1[1]);
  1531                              <1> 
  1532                              <1> 
  1533                              <1> 
  1534                              <1> 
  1535                              <1>  %if %0 >= 2
  1536 00000971 8B1D[20170000]      <1>  mov ebx, %2
  1537                              <1>  %if %0 >= 3
  1538                              <1>  mov ecx, %3
  1539                              <1>  %if %0 = 4
  1540                              <1>  mov edx, %4
  1541                              <1>  %endif
  1542                              <1>  %endif
  1543                              <1>  %endif
  1544 00000977 B806000000          <1>  mov eax, %1
  1545 0000097C CD30                <1>  int 30h
  1546 0000097E 89F8                    	mov	eax, edi
  1547                                  _96:
  1548 00000980 5B                      	pop	ebx
  1549 00000981 F7C240000000            	test	edx, FPRS  ; if((f&FPRS) != 0)
  1550 00000987 7411                    	jz	short _97
  1551 00000989 52                      	push	edx
  1552                                  	; eax = child PID
  1553 0000098A E81DFCFFFF              	call	prn	; prn(i);
  1554 0000098F BE[450F0000]            	mov	esi, nl ; prs("\n");
  1555 00000994 E8EAFBFFFF              	call	prs
  1556 00000999 5A                      	pop	edx
  1557                                  _97:
  1558 0000099A F7C201000000            	test	edx, FAND ; if((f&FAND) != 0)
  1559 000009A0 750A                    	jnz	short _99
  1560                                  _98:
  1561 000009A2 83E208                  	and	edx, FPOU ; if((f&FPOU) == 0)
  1562 000009A5 7505                    	jnz	short _99	
  1563                                  	;
  1564                                  	; EDI = i
  1565 000009A7 E878030000              	call	pwait  ; pwait(i);
  1566                                  _99:
  1567 000009AC C3                      	retn
  1568                                  _100:
  1569 000009AD 5B                      	pop	ebx
  1570                                  _101:
  1571 000009AE 8B7304                  	mov	esi, [ebx+DLEF] ; if(t[DLEF] != 0) {
  1572 000009B1 09F6                    	or	esi, esi
  1573 000009B3 7426                    	jz	short _102
  1574                                  
  1575                                  	sys	_close, 0 ; close(0);
  1576                              <1> 
  1577                              <1> 
  1578                              <1> 
  1579                              <1> 
  1580                              <1>  %if %0 >= 2
  1581 000009B5 BB00000000          <1>  mov ebx, %2
  1582                              <1>  %if %0 >= 3
  1583                              <1>  mov ecx, %3
  1584                              <1>  %if %0 = 4
  1585                              <1>  mov edx, %4
  1586                              <1>  %endif
  1587                              <1>  %endif
  1588                              <1>  %endif
  1589 000009BA B806000000          <1>  mov eax, %1
  1590 000009BF CD30                <1>  int 30h
  1591                                  
  1592                                  	sys	_open, esi, 0 ; i = open(t[DLEF], 0);
  1593                              <1> 
  1594                              <1> 
  1595                              <1> 
  1596                              <1> 
  1597                              <1>  %if %0 >= 2
  1598 000009C1 89F3                <1>  mov ebx, %2
  1599                              <1>  %if %0 >= 3
  1600 000009C3 B900000000          <1>  mov ecx, %3
  1601                              <1>  %if %0 = 4
  1602                              <1>  mov edx, %4
  1603                              <1>  %endif
  1604                              <1>  %endif
  1605                              <1>  %endif
  1606 000009C8 B805000000          <1>  mov eax, %1
  1607 000009CD CD30                <1>  int 30h
  1608 000009CF 7320                    	jnc	short _103	
  1609                                  
  1610 000009D1 E8ADFBFFFF              	call	prs ; prs(t[DLEF]);
  1611                                  
  1612 000009D6 BE[FD0E0000]            	mov	esi, open_err ; ": cannot open"
  1613                                  _102:
  1614 000009DB B8FF000000              	mov	eax, 255
  1615                                  
  1616 000009E0 E865FBFFFF              	call	err
  1617                                  
  1618                                  	sys	_exit, 255 ; exit(255);
  1619                              <1> 
  1620                              <1> 
  1621                              <1> 
  1622                              <1> 
  1623                              <1>  %if %0 >= 2
  1624 000009E5 BBFF000000          <1>  mov ebx, %2
  1625                              <1>  %if %0 >= 3
  1626                              <1>  mov ecx, %3
  1627                              <1>  %if %0 = 4
  1628                              <1>  mov edx, %4
  1629                              <1>  %endif
  1630                              <1>  %endif
  1631                              <1>  %endif
  1632 000009EA B801000000          <1>  mov eax, %1
  1633 000009EF CD30                <1>  int 30h
  1634                                  _103:
  1635 000009F1 89DF                    	mov	edi, ebx
  1636 000009F3 8B7308                  	mov	esi, [ebx+DRIT] ; if(t[DRIT] != 0) {
  1637 000009F6 21F6                    	and	esi, esi
  1638 000009F8 746D                    	jz	short _106
  1639                                  
  1640 000009FA F7C202000000            	test	edx, FCAT ; if((f&FCAT) != 0)
  1641 00000A00 7465                    	jz	short _106
  1642                                  
  1643                                  	sys	_open, esi, 1 ; i = open(t[DRIT], 1);
  1644                              <1> 
  1645                              <1> 
  1646                              <1> 
  1647                              <1> 
  1648                              <1>  %if %0 >= 2
  1649 00000A02 89F3                <1>  mov ebx, %2
  1650                              <1>  %if %0 >= 3
  1651 00000A04 B901000000          <1>  mov ecx, %3
  1652                              <1>  %if %0 = 4
  1653                              <1>  mov edx, %4
  1654                              <1>  %endif
  1655                              <1>  %endif
  1656                              <1>  %endif
  1657 00000A09 B805000000          <1>  mov eax, %1
  1658 00000A0E CD30                <1>  int 30h
  1659 00000A10 7320                    	jnc	short _105
  1660                                  
  1661                                  	sys	_creat, esi, 1B6h ; i = creat(t[DRIT], 0666);
  1662                              <1> 
  1663                              <1> 
  1664                              <1> 
  1665                              <1> 
  1666                              <1>  %if %0 >= 2
  1667 00000A12 89F3                <1>  mov ebx, %2
  1668                              <1>  %if %0 >= 3
  1669 00000A14 B9B6010000          <1>  mov ecx, %3
  1670                              <1>  %if %0 = 4
  1671                              <1>  mov edx, %4
  1672                              <1>  %endif
  1673                              <1>  %endif
  1674                              <1>  %endif
  1675 00000A19 B808000000          <1>  mov eax, %1
  1676 00000A1E CD30                <1>  int 30h
  1677 00000A20 7204                    	jc	short _104
  1678 00000A22 89C6                    	mov	esi, eax
  1679 00000A24 EB23                    	jmp	short f1
  1680                                  _104:
  1681 00000A26 E858FBFFFF              	call	prs    ; prs(t[DRIT]);
  1682                                  
  1683 00000A2B BE[0D0F0000]            	mov	esi, create_err ; ": cannot create"
  1684 00000A30 EBA9                    	jmp	short _102
  1685                                  _105:
  1686 00000A32 52                      	push	edx
  1687 00000A33 89C6                    	mov	esi, eax ; file descriptor
  1688                                  	sys	_seek, esi, 0, 2 ; lseek(i, 0L, 2);
  1689                              <1> 
  1690                              <1> 
  1691                              <1> 
  1692                              <1> 
  1693                              <1>  %if %0 >= 2
  1694 00000A35 89F3                <1>  mov ebx, %2
  1695                              <1>  %if %0 >= 3
  1696 00000A37 B900000000          <1>  mov ecx, %3
  1697                              <1>  %if %0 = 4
  1698 00000A3C BA02000000          <1>  mov edx, %4
  1699                              <1>  %endif
  1700                              <1>  %endif
  1701                              <1>  %endif
  1702 00000A41 B813000000          <1>  mov eax, %1
  1703 00000A46 CD30                <1>  int 30h
  1704 00000A48 5A                      	pop	edx
  1705                                  	;jmp	short f1 ; goto f1;
  1706                                  f1:
  1707                                  	sys	_close, 1 ; close(1);
  1708                              <1> 
  1709                              <1> 
  1710                              <1> 
  1711                              <1> 
  1712                              <1>  %if %0 >= 2
  1713 00000A49 BB01000000          <1>  mov ebx, %2
  1714                              <1>  %if %0 >= 3
  1715                              <1>  mov ecx, %3
  1716                              <1>  %if %0 = 4
  1717                              <1>  mov edx, %4
  1718                              <1>  %endif
  1719                              <1>  %endif
  1720                              <1>  %endif
  1721 00000A4E B806000000          <1>  mov eax, %1
  1722 00000A53 CD30                <1>  int 30h
  1723                                  	sys	_dup, esi ; dup(i);
  1724                              <1> 
  1725                              <1> 
  1726                              <1> 
  1727                              <1> 
  1728                              <1>  %if %0 >= 2
  1729 00000A55 89F3                <1>  mov ebx, %2
  1730                              <1>  %if %0 >= 3
  1731                              <1>  mov ecx, %3
  1732                              <1>  %if %0 = 4
  1733                              <1>  mov edx, %4
  1734                              <1>  %endif
  1735                              <1>  %endif
  1736                              <1>  %endif
  1737 00000A57 B826000000          <1>  mov eax, %1
  1738 00000A5C CD30                <1>  int 30h
  1739                                  	sys	_close, esi ; close(i);
  1740                              <1> 
  1741                              <1> 
  1742                              <1> 
  1743                              <1> 
  1744                              <1>  %if %0 >= 2
  1745 00000A5E 89F3                <1>  mov ebx, %2
  1746                              <1>  %if %0 >= 3
  1747                              <1>  mov ecx, %3
  1748                              <1>  %if %0 = 4
  1749                              <1>  mov edx, %4
  1750                              <1>  %endif
  1751                              <1>  %endif
  1752                              <1>  %endif
  1753 00000A60 B806000000          <1>  mov eax, %1
  1754 00000A65 CD30                <1>  int 30h
  1755                                  _106:
  1756 00000A67 F7C204000000            	test	edx, FPIN ; if((f&FPIN) != 0)
  1757 00000A6D 742F                    	jz	short _107
  1758                                  
  1759                                  	sys	_close, 0 ; close(0);
  1760                              <1> 
  1761                              <1> 
  1762                              <1> 
  1763                              <1> 
  1764                              <1>  %if %0 >= 2
  1765 00000A6F BB00000000          <1>  mov ebx, %2
  1766                              <1>  %if %0 >= 3
  1767                              <1>  mov ecx, %3
  1768                              <1>  %if %0 = 4
  1769                              <1>  mov edx, %4
  1770                              <1>  %endif
  1771                              <1>  %endif
  1772                              <1>  %endif
  1773 00000A74 B806000000          <1>  mov eax, %1
  1774 00000A79 CD30                <1>  int 30h
  1775                                  	sys	_dup, esi ; dup(i);
  1776                              <1> 
  1777                              <1> 
  1778                              <1> 
  1779                              <1> 
  1780                              <1>  %if %0 >= 2
  1781 00000A7B 89F3                <1>  mov ebx, %2
  1782                              <1>  %if %0 >= 3
  1783                              <1>  mov ecx, %3
  1784                              <1>  %if %0 = 4
  1785                              <1>  mov edx, %4
  1786                              <1>  %endif
  1787                              <1>  %endif
  1788                              <1>  %endif
  1789 00000A7D B826000000          <1>  mov eax, %1
  1790 00000A82 CD30                <1>  int 30h
  1791                                  	sys	_close, [pf1_0] ; close(pf1[0]);
  1792                              <1> 
  1793                              <1> 
  1794                              <1> 
  1795                              <1> 
  1796                              <1>  %if %0 >= 2
  1797 00000A84 8B1D[1C170000]      <1>  mov ebx, %2
  1798                              <1>  %if %0 >= 3
  1799                              <1>  mov ecx, %3
  1800                              <1>  %if %0 = 4
  1801                              <1>  mov edx, %4
  1802                              <1>  %endif
  1803                              <1>  %endif
  1804                              <1>  %endif
  1805 00000A8A B806000000          <1>  mov eax, %1
  1806 00000A8F CD30                <1>  int 30h
  1807                                          sys     _close, [pf1_1] ; close(pf1[1]);
  1808                              <1> 
  1809                              <1> 
  1810                              <1> 
  1811                              <1> 
  1812                              <1>  %if %0 >= 2
  1813 00000A91 8B1D[20170000]      <1>  mov ebx, %2
  1814                              <1>  %if %0 >= 3
  1815                              <1>  mov ecx, %3
  1816                              <1>  %if %0 = 4
  1817                              <1>  mov edx, %4
  1818                              <1>  %endif
  1819                              <1>  %endif
  1820                              <1>  %endif
  1821 00000A97 B806000000          <1>  mov eax, %1
  1822 00000A9C CD30                <1>  int 30h
  1823                                  _107:
  1824 00000A9E F7C208000000            	test	edx, FPOU ; if((f&FPOU) != 0)
  1825 00000AA4 7433                    	jz	short _108
  1826                                  
  1827                                  	sys	_close, 1 ; close(1);
  1828                              <1> 
  1829                              <1> 
  1830                              <1> 
  1831                              <1> 
  1832                              <1>  %if %0 >= 2
  1833 00000AA6 BB01000000          <1>  mov ebx, %2
  1834                              <1>  %if %0 >= 3
  1835                              <1>  mov ecx, %3
  1836                              <1>  %if %0 = 4
  1837                              <1>  mov edx, %4
  1838                              <1>  %endif
  1839                              <1>  %endif
  1840                              <1>  %endif
  1841 00000AAB B806000000          <1>  mov eax, %1
  1842 00000AB0 CD30                <1>  int 30h
  1843                                  	sys	_dup, [pf2_1] ; dup(pf2[1]);
  1844                              <1> 
  1845                              <1> 
  1846                              <1> 
  1847                              <1> 
  1848                              <1>  %if %0 >= 2
  1849 00000AB2 8B1D[28170000]      <1>  mov ebx, %2
  1850                              <1>  %if %0 >= 3
  1851                              <1>  mov ecx, %3
  1852                              <1>  %if %0 = 4
  1853                              <1>  mov edx, %4
  1854                              <1>  %endif
  1855                              <1>  %endif
  1856                              <1>  %endif
  1857 00000AB8 B826000000          <1>  mov eax, %1
  1858 00000ABD CD30                <1>  int 30h
  1859                                  	sys	_close, [pf2_0] ; close(pf2[0]);
  1860                              <1> 
  1861                              <1> 
  1862                              <1> 
  1863                              <1> 
  1864                              <1>  %if %0 >= 2
  1865 00000ABF 8B1D[24170000]      <1>  mov ebx, %2
  1866                              <1>  %if %0 >= 3
  1867                              <1>  mov ecx, %3
  1868                              <1>  %if %0 = 4
  1869                              <1>  mov edx, %4
  1870                              <1>  %endif
  1871                              <1>  %endif
  1872                              <1>  %endif
  1873 00000AC5 B806000000          <1>  mov eax, %1
  1874 00000ACA CD30                <1>  int 30h
  1875                                          sys     _close, [pf2_1] ; close(pf2[1]);
  1876                              <1> 
  1877                              <1> 
  1878                              <1> 
  1879                              <1> 
  1880                              <1>  %if %0 >= 2
  1881 00000ACC 8B1D[28170000]      <1>  mov ebx, %2
  1882                              <1>  %if %0 >= 3
  1883                              <1>  mov ecx, %3
  1884                              <1>  %if %0 = 4
  1885                              <1>  mov edx, %4
  1886                              <1>  %endif
  1887                              <1>  %endif
  1888                              <1>  %endif
  1889 00000AD2 B806000000          <1>  mov eax, %1
  1890 00000AD7 CD30                <1>  int 30h
  1891                                  
  1892                                  _108:
  1893                                  	; if((f&FINT)!=0 && t[DLEF]==0 && (f&FPIN)==0)
  1894                                  
  1895 00000AD9 F7C220000000            	test	edx, FINT
  1896 00000ADF 742D                    	jz	short _109
  1897 00000AE1 837F0400                	cmp	dword [edi+DLEF], 0
  1898 00000AE5 7527                    	jnz	short _109
  1899 00000AE7 F7C204000000            	test	edx, FPIN
  1900 00000AED 751F                    	jnz	short _109
  1901                                  	
  1902                                  	sys	_close, 0 ; close(0);
  1903                              <1> 
  1904                              <1> 
  1905                              <1> 
  1906                              <1> 
  1907                              <1>  %if %0 >= 2
  1908 00000AEF BB00000000          <1>  mov ebx, %2
  1909                              <1>  %if %0 >= 3
  1910                              <1>  mov ecx, %3
  1911                              <1>  %if %0 = 4
  1912                              <1>  mov edx, %4
  1913                              <1>  %endif
  1914                              <1>  %endif
  1915                              <1>  %endif
  1916 00000AF4 B806000000          <1>  mov eax, %1
  1917 00000AF9 CD30                <1>  int 30h
  1918                                  
  1919                                  	; open("/dev/null", 0);
  1920                                  	sys	_open, devnull, 0
  1921                              <1> 
  1922                              <1> 
  1923                              <1> 
  1924                              <1> 
  1925                              <1>  %if %0 >= 2
  1926 00000AFB BB[ED0E0000]        <1>  mov ebx, %2
  1927                              <1>  %if %0 >= 3
  1928 00000B00 B900000000          <1>  mov ecx, %3
  1929                              <1>  %if %0 = 4
  1930                              <1>  mov edx, %4
  1931                              <1>  %endif
  1932                              <1>  %endif
  1933                              <1>  %endif
  1934 00000B05 B805000000          <1>  mov eax, %1
  1935 00000B0A CD30                <1>  int 30h
  1936 00000B0C EB2B                    	jmp	short _110
  1937                                  _109:
  1938                                  	; if((f&FINT) == 0 && setintr) {
  1939 00000B0E 803D[3D110000]00        	cmp	byte [setintr], 0
  1940 00000B15 7622                    	jna	short _110	
  1941                                  	sys	_ssig, INTR, 0 ; signal(INTR, 0);
  1942                              <1> 
  1943                              <1> 
  1944                              <1> 
  1945                              <1> 
  1946                              <1>  %if %0 >= 2
  1947 00000B17 BB02000000          <1>  mov ebx, %2
  1948                              <1>  %if %0 >= 3
  1949 00000B1C B900000000          <1>  mov ecx, %3
  1950                              <1>  %if %0 = 4
  1951                              <1>  mov edx, %4
  1952                              <1>  %endif
  1953                              <1>  %endif
  1954                              <1>  %endif
  1955 00000B21 B828000000          <1>  mov eax, %1
  1956 00000B26 CD30                <1>  int 30h
  1957                                  	sys	_ssig, QUIT, 0 ; signal(QUIT, 0);
  1958                              <1> 
  1959                              <1> 
  1960                              <1> 
  1961                              <1> 
  1962                              <1>  %if %0 >= 2
  1963 00000B28 BB03000000          <1>  mov ebx, %2
  1964                              <1>  %if %0 >= 3
  1965 00000B2D B900000000          <1>  mov ecx, %3
  1966                              <1>  %if %0 = 4
  1967                              <1>  mov edx, %4
  1968                              <1>  %endif
  1969                              <1>  %endif
  1970                              <1>  %endif
  1971 00000B32 B828000000          <1>  mov eax, %1
  1972 00000B37 CD30                <1>  int 30h
  1973                                  _110:
  1974 00000B39 833F02                  	cmp	dword [edi+DTYP], TPAR ; if(t[DTYP] == TPAR)
  1975 00000B3C 752B                    	jne	short _112
  1976 00000B3E 8B5F10                  	mov	ebx, [edi+DSPR] ; if(t1 = t[DSPR])
  1977 00000B41 09DB                    	or	ebx, ebx
  1978 00000B43 7408                    	jz	short _111
  1979 00000B45 89D0                    	mov	eax, edx
  1980 00000B47 83E020                  	and	eax, FINT  ; f&FINT;	
  1981 00000B4A 09430C                  	or	[ebx+DFLG], eax ; t1[DFLG] =| f&FINT;
  1982                                  _111:
  1983 00000B4D 89D8                    	mov	eax, ebx  ; execute(t1);
  1984                                  
  1985 00000B4F 29C9                    	sub	ecx, ecx ; 0  ; pf1[0]	
  1986 00000B51 29D2                    	sub	edx, edx     
  1987 00000B53 42                      	inc	edx 	 ; 1  ; pf1[1] 
  1988 00000B54 29F6                    	sub	esi, esi ; 0  ; pf2[0]
  1989 00000B56 89D7                    	mov	edi, edx ; 1  ; pf2[1]
  1990                                  
  1991 00000B58 E8A0FCFFFF              	call	execute
  1992                                  
  1993                                  	sys 	_exit, 255
  1994                              <1> 
  1995                              <1> 
  1996                              <1> 
  1997                              <1> 
  1998                              <1>  %if %0 >= 2
  1999 00000B5D BBFF000000          <1>  mov ebx, %2
  2000                              <1>  %if %0 >= 3
  2001                              <1>  mov ecx, %3
  2002                              <1>  %if %0 = 4
  2003                              <1>  mov edx, %4
  2004                              <1>  %endif
  2005                              <1>  %endif
  2006                              <1>  %endif
  2007 00000B62 B801000000          <1>  mov eax, %1
  2008 00000B67 CD30                <1>  int 30h
  2009                                  _112:
  2010 00000B69 C605[40110000]00        	mov	byte [gflg], 0 ; gflg = 0;
  2011                                  
  2012                                  	; EDI = t
  2013 00000B70 BB[DA0D0000]            	mov	ebx, tglob
  2014 00000B75 E84A020000              	call	scan
  2015 00000B7A 803D[40110000]00        	cmp	byte [gflg], 0 ; if(gflg) {
  2016 00000B81 7631                    	jna	short _114
  2017                                  
  2018                                  	; t[DSPR] = "/etc/glob";
  2019 00000B83 83C710                  	add	edi, DSPR ; t+DSPR	
  2020 00000B86 57                      	push	edi
  2021 00000B87 BE[DB0E0000]            	mov	esi, globf
  2022                                  _113:
  2023 00000B8C AC                      	lodsb
  2024 00000B8D AA                      	stosb
  2025 00000B8E 20C0                    	and	al, al
  2026 00000B90 75FA                    	jnz	short _113
  2027 00000B92 5F                      	pop	edi
  2028                                  	sys	_exec, [edi], edi ; execv(t[DSPR], t+DSPR);
  2029                              <1> 
  2030                              <1> 
  2031                              <1> 
  2032                              <1> 
  2033                              <1>  %if %0 >= 2
  2034 00000B93 8B1F                <1>  mov ebx, %2
  2035                              <1>  %if %0 >= 3
  2036 00000B95 89F9                <1>  mov ecx, %3
  2037                              <1>  %if %0 = 4
  2038                              <1>  mov edx, %4
  2039                              <1>  %endif
  2040                              <1>  %endif
  2041                              <1>  %endif
  2042 00000B97 B80B000000          <1>  mov eax, %1
  2043 00000B9C CD30                <1>  int 30h
  2044                                  
  2045 00000B9E BE[DA0F0000]            	mov	esi, glob_cannotexec ; "glob: cannot execute"
  2046 00000BA3 E8DBF9FFFF              	call	prs
  2047                                  
  2048                                  	sys	_exit, 255
  2049                              <1> 
  2050                              <1> 
  2051                              <1> 
  2052                              <1> 
  2053                              <1>  %if %0 >= 2
  2054 00000BA8 BBFF000000          <1>  mov ebx, %2
  2055                              <1>  %if %0 >= 3
  2056                              <1>  mov ecx, %3
  2057                              <1>  %if %0 = 4
  2058                              <1>  mov edx, %4
  2059                              <1>  %endif
  2060                              <1>  %endif
  2061                              <1>  %endif
  2062 00000BAD B801000000          <1>  mov eax, %1
  2063 00000BB2 CD30                <1>  int 30h
  2064                                  _114:
  2065                                  	; EDI = t
  2066 00000BB4 BB[F10D0000]            	mov	ebx, trim
  2067 00000BB9 E806020000              	call	scan
  2068 00000BBE 8B35[4C110000]          	mov	esi, [linep]
  2069 00000BC4 C60600                  	mov	byte [esi], 0 ; *linep = 0;
  2070                                  
  2071                                  	; EDI = t
  2072 00000BC7 89FA                    	mov	edx, edi
  2073 00000BC9 83C214                  	add	edx, DCOM
  2074                                  	; [EDX] = t[DCOM]
  2075 00000BCC E824020000              	call	texec ; texec(t[DCOM], t);
  2076 00000BD1 57                      	push 	edi
  2077 00000BD2 8B3D[4C110000]          	mov	edi, [linep] ; cp1 = linep;
  2078 00000BD8 BE[F70E0000]            	mov	esi, bin_dir ; cp2 = "/usr/bin/";
  2079                                  _115:
  2080 00000BDD AC                      	lodsb  	; while(*cp1 = *cp2++)
  2081 00000BDE 20C0                    	and	al, al
  2082 00000BE0 7403                    	jz	short _116
  2083 00000BE2 AA                      	stosb   ; cp1++;
  2084 00000BE3 EBF8                    	jmp	short _115
  2085                                  _116:
  2086 00000BE5 5F                      	pop	edi ; t
  2087 00000BE6 89FA                    	mov	edx, edi
  2088 00000BE8 83C714                  	add	edi, DCOM
  2089 00000BEB 57                      	push	edi
  2090                                  _117:
  2091 00000BEC AC                      	lodsb  	; while(*cp1++ = *cp2++);
  2092 00000BED AA                      	stosb   ; cp1++;
  2093 00000BEE 20C0                    	and	al, al
  2094 00000BF0 75FA                    	jnz	short _117
  2095 00000BF2 5E                      	pop	esi ; t+DCOM		
  2096 00000BF3 89D7                    	mov	edi, edx ; t
  2097 00000BF5 8B15[4C110000]          	mov	edx, [linep]
  2098 00000BFB 83C204                  	add	edx, 4
  2099 00000BFE 89FD                    	mov	ebp, edi
  2100 00000C00 E8F0010000              	call	texec ; texec(linep+4, t);
  2101 00000C05 8B15[4C110000]          	mov	edx, [linep]
  2102 00000C0B 89EF                    	mov	edi, ebp ; t
  2103 00000C0D E8E3010000              	call	texec ; texec(linep, t);
  2104                                  
  2105 00000C12 8B7514                  	mov	esi, [ebp+DCOM]
  2106 00000C15 E869F9FFFF              	call	prs  ; prs(t[DCOM]);	
  2107                                  
  2108 00000C1A BE[16100000]            	mov 	esi, not_found_err
  2109 00000C1F E826F9FFFF              	call	err ; err(": not found",255);
  2110                                  
  2111                                  	sys _exit, 255 ; exit(255);
  2112                              <1> 
  2113                              <1> 
  2114                              <1> 
  2115                              <1> 
  2116                              <1>  %if %0 >= 2
  2117 00000C24 BBFF000000          <1>  mov ebx, %2
  2118                              <1>  %if %0 >= 3
  2119                              <1>  mov ecx, %3
  2120                              <1>  %if %0 = 4
  2121                              <1>  mov edx, %4
  2122                              <1>  %endif
  2123                              <1>  %endif
  2124                              <1>  %endif
  2125 00000C29 B801000000          <1>  mov eax, %1
  2126 00000C2E CD30                <1>  int 30h
  2127                                  _118:
  2128 00000C30 83F803                  	cmp	eax, TFIL ; case TFIL:
  2129 00000C33 0F85A5000000                    jne     _119
  2130                                  	;
  2131                                  	;mov	edx, [ebx+DFLG]
  2132                                  	
  2133                                  	sys	_pipe
  2134                              <1> 
  2135                              <1> 
  2136                              <1> 
  2137                              <1> 
  2138                              <1>  %if %0 >= 2
  2139                              <1>  mov ebx, %2
  2140                              <1>  %if %0 >= 3
  2141                              <1>  mov ecx, %3
  2142                              <1>  %if %0 = 4
  2143                              <1>  mov edx, %4
  2144                              <1>  %endif
  2145                              <1>  %endif
  2146                              <1>  %endif
  2147 00000C39 B827000000          <1>  mov eax, %1
  2148 00000C3E CD30                <1>  int 30h
  2149 00000C40 0FB7F0                  	movzx	esi, ax ; pv[0] ; 16 bit file descriptor
  2150 00000C43 C1E810                  	shr	eax, 16 ; HW -> LW
  2151 00000C46 0FB7F8                  	movzx	edi, ax ; pv[1] ; 16 bit file decstriptor
  2152                                  	
  2153 00000C49 52                      	push	edx ; f
  2154 00000C4A 53                      	push	ebx
  2155 00000C4B 8B4304                  	mov 	eax, [ebx+DLEF]
  2156 00000C4E 89D1                    	mov	ecx, edx
  2157                                  	; t1[DFLG] =| FPOU | (f&(FPIN|FINT|FPRS));
  2158 00000C50 83C964                  	or	ecx, FPIN+FINT+FPRS
  2159 00000C53 50                      	push	eax ; t1
  2160 00000C54 83C00C                  	add	eax, DFLG
  2161 00000C57 0908                    	or	[eax], ecx
  2162 00000C59 800808                          or      byte [eax], FPOU
  2163 00000C5C 58                      	pop	eax ; t1
  2164 00000C5D FF35[28170000]          	push	dword [pf2_1]
  2165 00000C63 FF35[24170000]          	push	dword [pf2_0]
  2166 00000C69 FF35[20170000]          	push	dword [pf1_1]
  2167 00000C6F FF35[1C170000]          	push	dword [pf1_0]
  2168 00000C75 57                      	push	edi
  2169 00000C76 56                      	push	esi
  2170 00000C77 E881FBFFFF              	call	execute ; execute(t1, pf1, pv);
  2171 00000C7C 5E                      	pop	esi ; [pv_0]
  2172 00000C7D 5F                      	pop	edi ; [pv_1]
  2173 00000C7E 8F05[1C170000]          	pop	dword [pf1_0]
  2174 00000C84 8F05[20170000]          	pop	dword [pf1_1]
  2175 00000C8A 8F05[24170000]          	pop	dword [pf2_0]
  2176 00000C90 8F05[28170000]          	pop	dword [pf2_1]
  2177 00000C96 5B                      	pop	ebx ; t
  2178 00000C97 5A                      	pop	edx ; f
  2179 00000C98 8B4308                  	mov	eax, [ebx+DRIT] ; t1 = t[DRIT];
  2180                                  	; t1[DFLG] =| FPIN | (f&(FPOU|FINT|FAND|FPRS));
  2181 00000C9B 83CA69                  	or	edx, FPOU+FINT+FAND+FPRS
  2182 00000C9E 50                      	push	eax ; t1
  2183 00000C9F 83C00C                  	add	eax, DFLG
  2184 00000CA2 0908                    	or	[eax], ecx
  2185 00000CA4 800804                          or      byte [eax], FPIN
  2186 00000CA7 58                      	pop	eax ; t1
  2187 00000CA8 FF35[28170000]          	push	dword [pf2_1]
  2188 00000CAE FF35[24170000]          	push	dword [pf2_0]
  2189 00000CB4 FF35[20170000]          	push	dword [pf1_1]
  2190 00000CBA FF35[1C170000]          	push	dword [pf1_0]
  2191 00000CC0 E838FBFFFF              	call	execute ; execute(t1, pv, pf2);
  2192 00000CC5 8F05[1C170000]          	pop	dword [pf1_0]
  2193 00000CCB 8F05[20170000]          	pop	dword [pf1_1]
  2194 00000CD1 8F05[24170000]          	pop	dword [pf2_0]
  2195 00000CD7 8F05[28170000]          	pop	dword [pf2_1]
  2196                                  
  2197 00000CDD C3                      	retn
  2198                                  _119:
  2199 00000CDE 83F804                  	cmp	eax, TLST ; case TLST:
  2200 00000CE1 753F                    	jne	short _122
  2201                                  	;
  2202 00000CE3 83E220                  	and	edx, FINT ; f = t[DFLG]&FINT;
  2203 00000CE6 8B4304                  	mov	eax, [ebx+DLEF] ; if(t1 = t[DLEF])
  2204 00000CE9 21C0                    	and	eax, eax
  2205 00000CEB 7415                    	jz	short _120
  2206 00000CED 09500C                  	or 	[eax+DFLG], edx ; t1[DFLG] =| f;
  2207                                  	
  2208 00000CF0 53                      	push	ebx
  2209 00000CF1 52                      	push	edx
  2210 00000CF2 31C9                    	xor	ecx, ecx ; pf1[0]
  2211 00000CF4 31F6                    	xor	esi, esi ; pf2[0]
  2212 00000CF6 31D2                    	xor	edx, edx 
  2213 00000CF8 42                      	inc	edx      ; pf1[1]  
  2214 00000CF9 89D7                    	mov	edi, edx ; pf2[1]
  2215                                  
  2216 00000CFB E8FDFAFFFF              	call	execute ; execute(t1);
  2217 00000D00 5A                      	pop	edx
  2218 00000D01 5B                      	pop	ebx
  2219                                  _120:
  2220 00000D02 8B4308                  	mov	eax, [ebx+DRIT] ; if(t1 = t[DRIT])
  2221 00000D05 09C0                    	or	eax, eax
  2222 00000D07 740F                    	jz	short _121
  2223 00000D09 09500C                  	or 	[eax+DFLG], edx ; t1[DFLG] =| f;
  2224                                  	
  2225 00000D0C 31F6                    	xor	esi, esi ; pf2[0]
  2226 00000D0E 31D2                    	xor	edx, edx 
  2227 00000D10 42                      	inc	edx      ; pf1[1]  
  2228 00000D11 89D7                    	mov	edi, edx ; pf2[1]
  2229                                  
  2230 00000D13 E8E5FAFFFF              	call	execute ; execute(t1);
  2231                                  _121:
  2232 00000D18 C3                      	retn	; return;
  2233                                  
  2234                                  
  2235                                  _equal:	; equal(as1, as2)
  2236 00000D19 57                      	push edi
  2237                                  _equal_loop:
  2238                                  	; while(*s1++ == *s2)
  2239                                  	;	if(*s2++ == '\0')
  2240                                  	;		return(1);
  2241                                  	; return(0);
  2242                                  	;
  2243                                  	; ESI = *s2
  2244                                  	; EDI = *s1
  2245                                  	;
  2246 00000D1A AC                      	lodsb
  2247 00000D1B AE                      	scasb
  2248 00000D1C 7504                    	jne short _122 ; zf = 0
  2249 00000D1E 20C0                    	and al, al ; *s2 (ESI)
  2250 00000D20 75F8                    	jnz short _equal_loop
  2251                                  	; zf = 1
  2252                                  _122: 
  2253 00000D22 5F                      	pop edi	
  2254 00000D23 C3                      	retn
  2255                                  
  2256                                  pwait:	; pwait(i)
  2257                                  
  2258 00000D24 21FF                    	and	edi, edi ; if(i != 0)
  2259 00000D26 0F8497000000                    jz      _128
  2260                                  	
  2261                                  	;for(;;) {
  2262                                  
  2263                                  	sys	_waits ; p = wait(&s);
  2264                              <1> 
  2265                              <1> 
  2266                              <1> 
  2267                              <1> 
  2268                              <1>  %if %0 >= 2
  2269                              <1>  mov ebx, %2
  2270                              <1>  %if %0 >= 3
  2271                              <1>  mov ecx, %3
  2272                              <1>  %if %0 = 4
  2273                              <1>  mov edx, %4
  2274                              <1>  %endif
  2275                              <1>  %endif
  2276                              <1>  %endif
  2277 00000D2C B829000000          <1>  mov eax, %1
  2278 00000D31 CD30                <1>  int 30h
  2279 00000D33 0F828A000000                    jc      _128
  2280                                  
  2281                                  	; ebx = signal, eax = child PID
  2282                                  
  2283 00000D39 09DB                    	or	ebx, ebx ; s
  2284 00000D3B 0F8482000000                    jz      _128
  2285                                  	
  2286 00000D41 89D9                    	mov	ecx, ebx 
  2287 00000D43 83E17F                  	and	ecx, 7Fh ; e = s&0177;	
  2288 00000D46 80F910                  	cmp	cl, NSIG
  2289 00000D49 7228                    	jb	short _124
  2290                                  
  2291 00000D4B 51                      	push	ecx
  2292                                  	; eax = p  ; PID
  2293 00000D4C 39F8                    	cmp	eax, edi
  2294 00000D4E 740F                    	je	short _123
  2295 00000D50 E857F8FFFF              	call	prn
  2296 00000D55 BE[24100000]            	mov	esi, prs_sc ; db ": ", 0
  2297 00000D5A E824F8FFFF              	call	prs	
  2298                                  _123:
  2299 00000D5F 59                      	pop	ecx
  2300 00000D60 51                      	push	ecx
  2301 00000D61 BE[27100000]            	mov	esi, prs_signal ; "Signal "
  2302 00000D66 E818F8FFFF              	call	prs
  2303 00000D6B 58                      	pop	eax
  2304 00000D6C E83BF8FFFF              	call	prn
  2305 00000D71 EB12                    	jmp	short _125	
  2306                                  _124:
  2307 00000D73 89CA                    	mov	edx, ecx
  2308 00000D75 51                      	push	ecx
  2309 00000D76 C1E202                  	shl	edx, 2 ; dd
  2310 00000D79 8BB2[44100000]          	mov	esi, [edx+mesg_NSIG]
  2311 00000D7F E8FFF7FFFF              	call	prs
  2312 00000D84 59                      	pop	ecx
  2313                                  _125:
  2314 00000D85 5B                      	pop	ebx ; s
  2315 00000D86 F7C380000000            	test	ebx, 80h ; if(s&0200)
  2316 00000D8C 740E                    	jz	short _126
  2317 00000D8E 53                      	push	ebx
  2318 00000D8F 51                      	push	ecx
  2319 00000D90 BE[2F100000]            	mov	esi, core_dumped ; " -- Core dumped"
  2320 00000D95 E8E9F7FFFF              	call	prs
  2321 00000D9A 59                      	pop	ecx
  2322 00000D9B 5B                      	pop	ebx
  2323                                  _126:
  2324 00000D9C 31C0                    	xor	eax, eax
  2325 00000D9E A0[36110000]            	mov	al, [stoperr]
  2326 00000DA3 6621D8                  	and	ax, bx
  2327 00000DA6 7415                    	jz	short _127
  2328 00000DA8 66C1EB08                	shr	bx, 8
  2329 00000DAC 28C0                    	sub	al, al
  2330 00000DAE 50                      	push	eax
  2331 00000DAF 89E6                    	mov	esi, esp ; ""
  2332 00000DB1 88D8                    	mov	al, bl ; (s>>8)
  2333 00000DB3 50                      	push	eax
  2334 00000DB4 08C8                    	or	al, cl ; (s>>8)|e 
  2335 00000DB6 E88FF7FFFF                      call    err
  2336 00000DBB 5B                      	pop	ebx ; s>>8
  2337 00000DBC 58                      	pop	eax ; 0		
  2338                                  _127: 
  2339 00000DBD 081D[37110000]          	or	[errval], bl ; errval =| (s>>8);
  2340                                  
  2341                                  _128:
  2342 00000DC3 C3                      	retn
  2343                                  
  2344                                  
  2345                                  scan:	; scan(at, f)
  2346                                  
  2347 00000DC4 8B7714                  	mov	esi, [edi+DCOM] ; t = at+DCOM;
  2348                                  _129:
  2349 00000DC7 AD                      	lodsd 	; while(p = *t++)
  2350 00000DC8 21C0                    	and	eax, eax
  2351 00000DCA 740D                    	jz	short _131
  2352                                  _130:
  2353 00000DCC 8A08                    	mov	cl, [eax] ; while(c = *p)
  2354 00000DCE 08C9                    	or	cl, cl
  2355 00000DD0 74F5                    	jz	short _129
  2356 00000DD2 FF13                    	call	[ebx] ; *p++ = (*f)(c);
  2357 00000DD4 8808                    	mov	[eax], cl
  2358 00000DD6 40                      	inc	eax
  2359 00000DD7 EBF3                    	jmp	short _130
  2360                                  _131:
  2361 00000DD9 C3                      	retn	
  2362                                  
  2363                                  tglob:	; tglob(c)
  2364                                  		; if(any(c, "[?*"))
  2365 00000DDA 80F95B                  	cmp	cl, "["
  2366 00000DDD 740B                    	je	short _132
  2367 00000DDF 80F93F                  	cmp	cl, "?"
  2368 00000DE2 7406                    	je	short _132
  2369 00000DE4 80F92A                  	cmp	cl, "*"
  2370 00000DE7 7401                    	je	short _132
  2371 00000DE9 C3                      	retn
  2372                                  _132:
  2373 00000DEA FE05[40110000]          	inc	byte [gflg] ; gflg = 1;
  2374 00000DF0 C3                      	retn	; return(c);
  2375                                  
  2376                                  
  2377                                  trim:	; trim(c)
  2378                                  	
  2379 00000DF1 80E17F                  	and	cl , 7Fh ; return(c&0177);
  2380 00000DF4 C3                      	retn
  2381                                  
  2382                                  
  2383                                  texec:  ; texec(f, at)
  2384                                  
  2385                                  	;t = at;
  2386                                  
  2387                                  	; EDX = f
  2388                                  	; EDI = t
  2389 00000DF5 89FE                    	mov	esi, edi
  2390 00000DF7 83C614                  	add	esi, DCOM ; t+DCOM	
  2391                                  	
  2392                                  	sys 	_exec, [edx], esi ; execv(f, t+DCOM);
  2393                              <1> 
  2394                              <1> 
  2395                              <1> 
  2396                              <1> 
  2397                              <1>  %if %0 >= 2
  2398 00000DFA 8B1A                <1>  mov ebx, %2
  2399                              <1>  %if %0 >= 3
  2400 00000DFC 89F1                <1>  mov ecx, %3
  2401                              <1>  %if %0 = 4
  2402                              <1>  mov edx, %4
  2403                              <1>  %endif
  2404                              <1>  %endif
  2405                              <1>  %endif
  2406 00000DFE B80B000000          <1>  mov eax, %1
  2407 00000E03 CD30                <1>  int 30h
  2408                                  
  2409                                  	; eax = errno
  2410                                  
  2411 00000E05 83F808                  	cmp	eax, ENOEXEC ; if (errno==ENOEXEC)
  2412 00000E08 753F                    	jne	short _135
  2413 00000E0A 8B1D[4C110000]          	mov	ebx, [linep]
  2414 00000E10 8B03                    	mov	eax, [ebx]
  2415 00000E12 21C0                    	and	eax, eax ; if (*linep)
  2416 00000E14 7402                    	jz	short _133	
  2417 00000E16 891E                    	mov	[esi], ebx ; t[DCOM] = linep;
  2418                                  _133:
  2419 00000E18 83C710                  	add	edi, DSPR ; t[DSPR] = "/usr/bin/osh";
  2420 00000E1B 57                      	push	edi
  2421 00000E1C BE[E50E0000]            	mov	esi, shellf ; "/bin/sh"
  2422                                  _134:
  2423 00000E21 AC                      	lodsb
  2424 00000E22 AA                      	stosb
  2425 00000E23 08C0                    	or	al, al
  2426 00000E25 75FA                    	jnz	short _134
  2427 00000E27 5F                      	pop	edi
  2428                                  	
  2429                                  	sys	_exec, [edi], edi ; execv(t[DSPR], t+DSPR);
  2430                              <1> 
  2431                              <1> 
  2432                              <1> 
  2433                              <1> 
  2434                              <1>  %if %0 >= 2
  2435 00000E28 8B1F                <1>  mov ebx, %2
  2436                              <1>  %if %0 >= 3
  2437 00000E2A 89F9                <1>  mov ecx, %3
  2438                              <1>  %if %0 = 4
  2439                              <1>  mov edx, %4
  2440                              <1>  %endif
  2441                              <1>  %endif
  2442                              <1>  %endif
  2443 00000E2C B80B000000          <1>  mov eax, %1
  2444 00000E31 CD30                <1>  int 30h
  2445                                  
  2446 00000E33 BE[FD0F0000]            	mov	esi, no_shell_err ; prs("No shell!\n");
  2447 00000E38 E846F7FFFF              	call	prs
  2448                                  	
  2449                                  	sys	_exit, 255 ; exit(255);
  2450                              <1> 
  2451                              <1> 
  2452                              <1> 
  2453                              <1> 
  2454                              <1>  %if %0 >= 2
  2455 00000E3D BBFF000000          <1>  mov ebx, %2
  2456                              <1>  %if %0 >= 3
  2457                              <1>  mov ecx, %3
  2458                              <1>  %if %0 = 4
  2459                              <1>  mov edx, %4
  2460                              <1>  %endif
  2461                              <1>  %endif
  2462                              <1>  %endif
  2463 00000E42 B801000000          <1>  mov eax, %1
  2464 00000E47 CD30                <1>  int 30h
  2465                                  _135:
  2466 00000E49 83F80C                  	cmp	eax, ENOMEM ; if (errno==ENOMEM)
  2467 00000E4C 751D                    	jne	short _136
  2468                                  
  2469 00000E4E 8B36                    	mov	esi, [esi] ; t[DCOM]
  2470 00000E50 E82EF7FFFF              	call	prs
  2471 00000E55 BE[08100000]            	mov	esi, too_large_err ; ": too large"
  2472 00000E5A E8EBF6FFFF              	call	err
  2473                                  
  2474                                  	sys	_exit, 255
  2475                              <1> 
  2476                              <1> 
  2477                              <1> 
  2478                              <1> 
  2479                              <1>  %if %0 >= 2
  2480 00000E5F BBFF000000          <1>  mov ebx, %2
  2481                              <1>  %if %0 >= 3
  2482                              <1>  mov ecx, %3
  2483                              <1>  %if %0 = 4
  2484                              <1>  mov edx, %4
  2485                              <1>  %endif
  2486                              <1>  %endif
  2487                              <1>  %endif
  2488 00000E64 B801000000          <1>  mov eax, %1
  2489 00000E69 CD30                <1>  int 30h
  2490                                  _136:
  2491 00000E6B C3                      	retn
  2492                                  
  2493                                  setexit:
  2494                                  	; set return address after an error
  2495                                  	;
  2496                                  	; Derived from UNIX v6 (on 286) - SH.C
  2497                                  	;	& RESET.ASM  (_setexit)
  2498                                  	
  2499                                  	; modification by Erdogan Tan (3/12/2015)
  2500                                  	; (save stack pointer instead of return address)
  2501 00000E6C 8925[20110000]          	mov	[_setex], esp
  2502 00000E72 C3                      	retn
  2503                                  
  2504                                  reset:
  2505                                  	; return after an error (to 'setexit' return address)
  2506                                  	;
  2507                                  	; Derived from UNIX v6 (on 286) - SH.C
  2508                                  	;	& RESET.ASM  (_reset)
  2509                                  
  2510                                  	; modification by Erdogan Tan (3/12/2015)
  2511                                  	; (restore stack pointer instead of return address)
  2512 00000E73 8B25[20110000]          	mov	esp, [_setex]
  2513 00000E79 C3                      	retn
  2514                                  
  2515 00000E7A 0D0A                    msg_unix_sh:	db 0Dh, 0Ah
  2516 00000E7C 526574726F20556E69-     		db 'Retro Unix 386 v1.1 - shell'
  2517 00000E85 78203338362076312E-
  2518 00000E8E 31202D207368656C6C 
  2519                                  msgsh_size equ  $ - msg_unix_sh
  2520                                  prompt:
  2521 00000E97 0D0A                    		db 0Dh, 0Ah
  2522 00000E99 3F20                    promp: 		db "? " ; "# " for root , "% " for others
  2523 00000E9B 00                      		db 0
  2524 00000E9C 31302F31322F323031-     		db '10/12/2015'
  2525 00000EA5 35                 
  2526                                  
  2527                                  keyword_chdir:
  2528 00000EA6 636864697200            	db "chdir", 0
  2529                                  keyword_shift:
  2530 00000EAC 736869667400            	db "shift", 0
  2531                                  keyword_login:
  2532 00000EB2 6C6F67696E00            	db "login", 0
  2533                                  keyword_newgrp:
  2534 00000EB8 6E657767727000          	db "newgrp", 0
  2535                                  keyword_wait:
  2536 00000EBF 7761697400              	db "wait", 0
  2537                                  loginf:
  2538 00000EC4 2F62696E2F6C6F6769-     	db "/bin/login", 0
  2539 00000ECD 6E00               
  2540                                  newgrpf:
  2541 00000ECF 2F62696E2F6E657767-     	db "/bin/newgrp", 0
  2542 00000ED8 727000             
  2543                                  globf:
  2544 00000EDB 2F6574632F676C6F62-     	db "/etc/glob", 0
  2545 00000EE4 00                 
  2546                                  shellf:
  2547 00000EE5 2F62696E2F736800        	db "/bin/sh", 0
  2548                                  devnull:
  2549 00000EED 2F6465762F6E756C6C-     	db "/dev/null",0
  2550 00000EF6 00                 
  2551                                  bin_dir:
  2552 00000EF7 2F62696E2F00            	db "/bin/", 0
  2553                                  
  2554                                  open_err:
  2555 00000EFD 3A2063616E6E6F7420-     	db ": cannot open"," !", 0
  2556 00000F06 6F70656E202100     
  2557                                  
  2558                                  create_err:
  2559 00000F0D 3A2063616E6E6F7420-     	db ": cannot create"," !", 0
  2560 00000F16 637265617465202100 
  2561                                  
  2562                                  syntax_err:
  2563 00000F1F 73796E746178206572-     	db "syntax error"," !", 0
  2564 00000F28 726F72202100       
  2565                                  
  2566                                  cmdl_overflow:
  2567 00000F2E 436F6D6D616E64206C-     	db "Command line overflow"," !"
  2568 00000F37 696E65206F76657266-
  2569 00000F40 6C6F772021         
  2570                                  
  2571                                  nl:	; next line
  2572 00000F45 0D0A00                  	db 0Dh, 0Ah, 0
  2573                                  
  2574                                  many_args_err:
  2575 00000F48 546F6F206D616E7920-     	db "Too many args", " !", 0 
  2576 00000F51 61726773202100     
  2577                                  
  2578                                  many_chars_err:
  2579 00000F58 546F6F206D616E7920-     	db "Too many characters", " !", 0
  2580 00000F61 636861726163746572-
  2581 00000F6A 73202100           
  2582                                  chdir_argcount:
  2583 00000F6E 63686469723A206172-     	db "chdir: arg count", " !", 0
  2584 00000F77 6720636F756E742021-
  2585 00000F80 00                 
  2586                                  chdir_baddir:
  2587 00000F81 63686469723A206261-     	db "chdir: bad directory", " !", 0
  2588 00000F8A 64206469726563746F-
  2589 00000F93 7279202100         
  2590                                  shift_noargs:
  2591 00000F98 73686966743A206E6F-     	db "shift: no args", " !", 0
  2592 00000FA1 2061726773202100   
  2593                                  login_cannotexec:
  2594 00000FA9 6C6F67696E3A206361-     	db "login: cannot execute", " !", 0
  2595 00000FB2 6E6E6F742065786563-
  2596 00000FBB 757465202100       
  2597                                  newgrp_cannotexec:
  2598 00000FC1 6E65776772703A2063-     	db "newgrp: cannot execute", " !", 0
  2599 00000FCA 616E6E6F7420657865-
  2600 00000FD3 63757465202100     
  2601                                  glob_cannotexec:
  2602 00000FDA 676C6F623A2063616E-     	db "glob: cannot execute", " !", 0
  2603 00000FE3 6E6F74206578656375-
  2604 00000FEC 7465202100         
  2605                                  try_again:
  2606 00000FF1 74727920616761696E-     	db "try again", " !", 0
  2607 00000FFA 202100             
  2608                                  no_shell_err:
  2609 00000FFD 4E6F207368656C6C20-     	db "No shell"," !", 0
  2610 00001006 2100               
  2611                                  too_large_err:
  2612 00001008 3A20746F6F206C6172-     	db ": too large", " !", 0 
  2613 00001011 6765202100         
  2614                                  not_found_err:
  2615 00001016 3A206E6F7420666F75-     	db ": not found", " !", 0
  2616 0000101F 6E64202100         
  2617                                  prs_sc:
  2618 00001024 3A2000                  	db ": ", 0
  2619                                  prs_signal:
  2620 00001027 5369676E616C2000        	db "Signal ", 0
  2621                                  core_dumped:
  2622 0000102F 202D2D20436F726520-     	db " -- Core dumped"," !", 0
  2623 00001038 64756D706564202100 
  2624                                  
  2625 00001041 90<rept>                align 4
  2626                                  
  2627                                  mesg_NSIG:
  2628 00001044 [84100000]              	dd NSIG_01
  2629 00001048 [85100000]              	dd NSIG_02	
  2630 0000104C [8C100000]              	dd NSIG_03
  2631 00001050 [8D100000]              	dd NSIG_04
  2632 00001054 [92100000]              	dd NSIG_05
  2633 00001058 [A6100000]              	dd NSIG_06
  2634 0000105C [B5100000]              	dd NSIG_07
  2635 00001060 [BE100000]              	dd NSIG_08
  2636 00001064 [C7100000]              	dd NSIG_09
  2637 00001068 [DA100000]              	dd NSIG_10
  2638 0000106C [E1100000]              	dd NSIG_11
  2639 00001070 [EB100000]              	dd NSIG_12
  2640 00001074 [F8100000]              	dd NSIG_13
  2641 00001078 [08110000]              	dd NSIG_14
  2642 0000107C [09110000]              	dd NSIG_15
  2643 00001080 [15110000]              	dd NSIG_16
  2644                                  
  2645 00001084 00                      NSIG_01: db 0
  2646 00001085 48616E67757000          NSIG_02: db "Hangup", 0
  2647 0000108C 00                      NSIG_03: db 0
  2648 0000108D 5175697400              NSIG_04: db "Quit", 0
  2649 00001092 496C6C6567616C2069-     NSIG_05: db "Illegal instruction", 0
  2650 0000109B 6E737472756374696F-
  2651 000010A4 6E00               
  2652 000010A6 54726163652F425054-     NSIG_06: db "Trace/BPT trap", 0
  2653 000010AF 207472617000       
  2654 000010B5 494F54207472617000      NSIG_07: db "IOT trap", 0
  2655 000010BE 454D54207472617000      NSIG_08: db "EMT trap", 0
  2656 000010C7 466C6F6174696E6720-     NSIG_09: db "Floating exception", 0
  2657 000010D0 657863657074696F6E-
  2658 000010D9 00                 
  2659 000010DA 4B696C6C656400          NSIG_10: db "Killed", 0
  2660 000010E1 427573206572726F72-     NSIG_11: db "Bus error", 0
  2661 000010EA 00                 
  2662 000010EB 4D656D6F7279206661-     NSIG_12: db "Memory fault", 0
  2663 000010F4 756C7400           
  2664 000010F8 426164207379737465-     NSIG_13: db "Bad system call", 0
  2665 00001101 6D2063616C6C00     
  2666 00001108 00                      NSIG_14: db 0
  2667 00001109 416C61726D20636C6F-     NSIG_15: db "Alarm clock", 0
  2668 00001112 636B00             
  2669 00001115 5465726D696E617465-     NSIG_16: db "Terminated", 0
  2670 0000111E 6400               
  2671                                  
  2672                                  align 4
  2673                                  
  2674                                  _setex: ; UNIX v6 (on 286) - SH.C (& RESET.ASM)
  2675 00001120 00000000                	dd 0	
  2676                                  
  2677                                  dolp:	
  2678 00001124 00000000                	dd 0
  2679                                  dolc:
  2680 00001128 00000000                	dd 0
  2681                                  dolv:
  2682 0000112C 00000000                	dd 0
  2683                                  pidp:	
  2684 00001130 00000000                	dd 0
  2685 00001134 00                      	db 0
  2686                                  cc:
  2687 00001135 00                      	db 0
  2688                                  stoperr:
  2689 00001136 00                      	db 0
  2690                                  errval:
  2691 00001137 00                      	db 0
  2692                                  
  2693                                  align 4
  2694                                  
  2695                                  arginp:
  2696 00001138 00000000                	dd 0
  2697                                  onelflg:
  2698 0000113C 00                      	db 0
  2699                                  setintr:
  2700 0000113D 00                      	db 0
  2701                                  peekc:
  2702 0000113E 00                      	db 0
  2703                                  
  2704                                  error:
  2705 0000113F 00                      	db 0
  2706                                  gflg:
  2707 00001140 00                      	db 0
  2708                                  
  2709 00001141 90<rept>                align 4
  2710                                  
  2711                                  argp:
  2712 00001144 00000000                	dd 0
  2713                                  eargp:
  2714 00001148 00000000                	dd 0
  2715                                  linep:
  2716 0000114C 00000000                	dd 0
  2717                                  elinep:
  2718 00001150 00000000                	dd 0
  2719                                  treep:
  2720 00001154 00000000                	dd 0
  2721                                  treeend:
  2722 00001158 00000000                	dd 0
  2723                                  
  2724                                  line:
  2725 0000115C 00<rept>                	times LINSIZ db 0 ; char	
  2726                                  args:	
  2727 00001544 00<rept>                	times ARGSIZ db 0 ; char
  2728                                  trebuf:
  2729 00001576 00000000<rept>          	times TRESIZ dd 0 ; int
  2730                                  
  2731                                  ;
  2732 00001706 90<rept>                align 4
  2733 00001708 00000000                p1:	dd 0
  2734 0000170C 00000000                p2:	dd 0
  2735 00001710 00                      flg:	db 0
  2736 00001711 90<rept>                align 4
  2737 00001714 00000000                _i:	dd 0
  2738 00001718 00000000                _o:	dd 0
  2739                                  ;
  2740 0000171C 00000000                pf1_0:	dd 0
  2741 00001720 00000000                pf1_1:	dd 0
  2742 00001724 00000000                pf2_0:	dd 0
  2743 00001728 00000000                pf2_1:	dd 0
  2744                                  ;
  2745                                  ;pv:	
  2746                                  ;	dd 0 
  2747                                  ;	dd 0
  2748                                  
  2749                                  ;align 4
  2750                                  
  2751                                  ; 10/12/2015
  2752                                  esc_esp: 
  2753 0000172C 00000000                	dd 0 ; restore esp after a CANCEL (ESC)
  2754                                  echo:
  2755 00001730 00                      	db 0 ; echo on/off status
