     1                                  ; ****************************************************************************
     2                                  ; ls386.s (ls1.s) - Retro Unix 386 v1.1 - /bin/ls - list file or directory
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
     5                                  ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
     6                                  ;
     7                                  ; [ Last Modification: 04/12/2015 ]
     8                                  ;
     9                                  ; Derived from 'ls0.asm' source code file of 'Retro UNIX 8086 v1'
    10                                  ; operating system project, /bin/ls source code by Erdogan Tan
    11                                  ; (19/11/2013-29/11/2013)
    12                                  ;
    13                                  ; Derived from 'ls.s' file of original UNIX operating system
    14                                  ; (v1.0 for PDP-11)
    15                                  ; ****************************************************************************
    16                                  
    17                                  ; ls1.s (04/12/2015), Retro UNIX 386 v1.1 (14 byte file names)
    18                                  ; ls0.s (07/10/2015), Retro UNIX 386 v1 (8 byte file names)
    19                                  
    20                                  ; ls386.s (23/09/2015, Retro UNIX 386 v1, NASM 2.11, 32 bit version)
    21                                  ; LS0.ASM, 19/11/2013 - 29/11/2013 (Retro UNIX 8086 v1, MASM 6.11) 
    22                                  
    23                                  ; Assembler: NASM 2.11
    24                                  
    25                                  ; 06/10/2015
    26                                  ; 05/10/2015
    27                                  ; 23/09/2015
    28                                  
    29                                  ; UNIX v1 system calls
    30                                  _rele 	equ 0
    31                                  _exit 	equ 1
    32                                  _fork 	equ 2
    33                                  _read 	equ 3
    34                                  _write	equ 4
    35                                  _open	equ 5
    36                                  _close 	equ 6
    37                                  _wait 	equ 7
    38                                  _creat 	equ 8
    39                                  _link 	equ 9
    40                                  _unlink	equ 10
    41                                  _exec	equ 11
    42                                  _chdir	equ 12
    43                                  _time 	equ 13
    44                                  _mkdir 	equ 14
    45                                  _chmod	equ 15
    46                                  _chown	equ 16
    47                                  _break	equ 17
    48                                  _stat	equ 18
    49                                  _seek	equ 19
    50                                  _tell 	equ 20
    51                                  _mount	equ 21
    52                                  _umount	equ 22
    53                                  _setuid	equ 23
    54                                  _getuid	equ 24
    55                                  _stime	equ 25
    56                                  _quit	equ 26	
    57                                  _intr	equ 27
    58                                  _fstat	equ 28
    59                                  _emt 	equ 29
    60                                  _mdate 	equ 30
    61                                  _stty 	equ 31
    62                                  _gtty	equ 32
    63                                  _ilgins	equ 33
    64                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    65                                  _msg	equ 35 ; Retro UNIX 386 v1 feature only !
    66                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    67                                  
    68                                  %macro sys 1-4
    69                                      ; 03/09/2015	
    70                                      ; 13/04/2015
    71                                      ; Retro UNIX 386 v1 system call.		
    72                                      %if %0 >= 2   
    73                                          mov ebx, %2
    74                                          %if %0 >= 3    
    75                                              mov ecx, %3
    76                                              %if %0 = 4
    77                                                 mov edx, %4   
    78                                              %endif
    79                                          %endif
    80                                      %endif
    81                                      mov eax, %1
    82                                      int 30h	   
    83                                  %endmacro
    84                                  
    85                                  ; Retro UNIX 386 v1 system call format:
    86                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    87                                  
    88                                  [BITS 32] ; We need 32-bit intructions for protected mode
    89                                  
    90                                  [ORG 0] 
    91                                  
    92                                  START_CODE:	; / ls -- list file or directory
    93                                  
    94                                  		;.globl	flush
    95                                  		;.globl	fopen
    96                                  		;.globl	getw
    97                                  		;.globl	getc
    98                                  		;.globl	putc
    99                                  		;.globl	ctime
   100                                  		;.globl	end
   101                                  
   102                                  	;mov	eax, _end + 512
   103                                  	;and	al, 0FEh
   104                                  	;cmp	eax, esp
   105                                  	;jna	short S1
   106                                  	;mov	esp, eax
   107                                  ;S1:	 
   108                                  	;mov 	ebx, eax
   109                                  
   110                                   	; Retro UNIX 8086 v1 modification:
   111                                  	;  'sys break' is not needed to extend 
   112                                  	;  current user core memory
   113                                  	;  (because of 8086 segmentation and 32 kB 
   114                                  	;   memory allocation);
   115                                  	;  but, it is needed to clear/reset
   116                                  	;  user core memory beyond of (after) previous
   117                                  	;  'u.break' which depends on executable
   118                                  	;  file size; because 'bss'
   119                                  	;  data is not in current executable file
   120                                  	; ('BSS' is an external data structure after
   121                                  	;  the last byte of the executable file).			  	 
   122                                  	 
   123                                  	; clear bss area
   124                                  	; (It is not necessary to clear bss area 
   125                                  	; because Retro UNIX 386 v1 kernel will clear
   126                                  	; this bss area during memory page allocation.)
   127                                  	;mov 	ecx, _end
   128                                  	;mov 	edi, bss_start
   129                                  	;sub	ecx, edi
   130                                  	;shr 	cx, 2
   131                                  	;sub	eax, eax
   132                                  	;rep 	stosd 	
   133                                  
   134                                  	; sys break
   135                                  	; clears memory from 'bss' to 'bss._end+512'	
   136 00000000 BB[70150000]            	mov	ebx, _end + 512
   137                                  	sys 	_break
   138                              <1> 
   139                              <1> 
   140                              <1> 
   141                              <1>  %if %0 >= 2
   142                              <1>  mov ebx, %2
   143                              <1>  %if %0 >= 3
   144                              <1>  mov ecx, %3
   145                              <1>  %if %0 = 4
   146                              <1>  mov edx, %4
   147                              <1>  %endif
   148                              <1>  %endif
   149                              <1>  %endif
   150 00000005 B811000000          <1>  mov eax, %1
   151 0000000A CD30                <1>  int 30h
   152                                  		; sys break; end+512.
   153                                  	sys	_write, 1, nl, 2
   154                              <1> 
   155                              <1> 
   156                              <1> 
   157                              <1>  %if %0 >= 2
   158 0000000C BB01000000          <1>  mov ebx, %2
   159                              <1>  %if %0 >= 3
   160 00000011 B9[D7080000]        <1>  mov ecx, %3
   161                              <1>  %if %0 = 4
   162 00000016 BA02000000          <1>  mov edx, %4
   163                              <1>  %endif
   164                              <1>  %endif
   165                              <1>  %endif
   166 0000001B B804000000          <1>  mov eax, %1
   167 00000020 CD30                <1>  int 30h
   168                                  	;	
   169 00000022 66891D[5A0B0000]        	mov	[obuf], bx ; 1
   170                                  		; mov $1,obuf
   171 00000029 89E6                    	mov	esi, esp
   172                                  		; mov sp,r5
   173 0000002B AD                      	lodsd
   174 0000002C 48                      	dec 	eax
   175 0000002D 66A3[FC080000]          	mov	[count], ax
   176                                  		; mov (r5)+,count
   177                                  		; tst (r5)+
   178                                  		; dec count
   179 00000033 66A3[FE080000]          	mov	[ocount], ax
   180                                  		; mov count,ocount
   181                                  		; bgt loop
   182                                  		; mov $dotp,r5
   183 00000039 7672                    	jna	short B0	
   184                                  	;and	eax, eax
   185                                  	;jnz	short S2	
   186                                  	;jz	short B0
   187                                  	;mov	esi, dotp
   188                                  	;jmp	short sloop
   189                                  ;S2:	
   190 0000003B AD                      	lodsd
   191                                  sloop:	;loop:
   192 0000003C AD                      	lodsd
   193 0000003D 89C3                    	mov	ebx, eax
   194                                  		;mov (r5)+,r4
   195 0000003F 803B2D                  	cmp	byte [ebx], '-'
   196                                  		; cmpb (r4)+,$'-
   197 00000042 7552                    	jne	short A1
   198                                  		; bne 1f
   199 00000044 43                      	inc	ebx
   200 00000045 66FF0D[FE080000]        	dec	word [ocount]
   201                                  		; dec ocount
   202                                  A3: ;3:
   203 0000004C 8A03                    	mov	al, [ebx]
   204                                  		; movb (r4)+,r0
   205 0000004E 43                      	inc	ebx
   206 0000004F 08C0                    	or	al, al
   207 00000051 7448                    	jz	short eloop
   208                                  		; beq eloop
   209 00000053 3C6C                    	cmp	al, 'l'
   210                                  		; cmp r0,$'l
   211 00000055 7509                    	jne	short S3
   212                                  		; bne 4f
   213 00000057 66FF05[00090000]        	inc	word [longf]
   214                                  		; inc longf
   215 0000005E EBEC                    	jmp	short A3
   216                                  		; br 3b
   217                                  S3: ;4:
   218 00000060 3C74                    	cmp	al, 't'
   219                                  		; cmpb r0,$'t
   220 00000062 750C                    	jne	short S4
   221                                  		; bne 4f
   222 00000064 C705[0C090000]0E00-     	mov	dword [sortoff], 14
   223 0000006C 0000               
   224                                  		; mov $14.,sortoff
   225 0000006E EBDC                    	jmp	short A3
   226                                  		; br 3b
   227                                  S4: ;4:
   228 00000070 3C61                    	cmp	al, 'a'
   229                                  		; cmpb r0,$'a
   230 00000072 7509                            jne     short S5
   231                                  		; bne 4f
   232 00000074 66FF05[02090000]        	inc	word [allflg]
   233                                  		; inc allflg
   234 0000007B EBCF                    	jmp	short A3
   235                                  S5: ;4:
   236 0000007D 3C73                    	cmp	al, 's'
   237                                  		; cmpb r0,$'s
   238 0000007F 7508                    	jne	short S6
   239                                  		; bne 4f
   240 00000081 FE05[01090000]          	inc 	byte [longf+1]
   241                                  		; incb longf+1
   242 00000087 EBC3                    	jmp	short A3
   243                                  		; br 3b
   244                                  S6: ;4:
   245 00000089 3C64                    	cmp	al, 'd'
   246                                  		; cmpb r0,$'d
   247 0000008B 75BF                    	jne	short A3
   248                                  		; bne 3b
   249 0000008D 66FF05[04090000]        	inc	word [dirflg]
   250                                  		; inc dirflg
   251 00000094 EBB6                    	jmp	short A3
   252                                  		; br 3b
   253                                  A1: ;1:
   254                                  	;dec	ebx
   255                                  		; dec r4
   256 00000096 E82A000000              	call	do
   257                                  		; jsr pc,do
   258                                  eloop:
   259 0000009B 66FF0D[FC080000]        	dec	word [count]
   260                                  		; dec count
   261 000000A2 7F98                    	jg	short sloop
   262                                  		; bgt loop
   263 000000A4 A1[C9080000]            	mov	eax, [dnp]
   264 000000A9 21C0                    	and	eax, eax	
   265                                  		;tst dnp
   266 000000AB 7507                    	jnz	short S7	
   267                                  		; bne 1f
   268                                  B0:
   269 000000AD BE[CD080000]            	mov	esi, dotp
   270                                  		; mov $dotp,r5
   271 000000B2 EB88                    	jmp	short sloop
   272                                  		; br loop
   273                                  S7: ;1:
   274 000000B4 BE[5A0B0000]            	mov	esi, obuf
   275 000000B9 E87D050000              	call	flush
   276                                  		; jsr r5,flush; obuf
   277                                  	sys	_exit
   278                              <1> 
   279                              <1> 
   280                              <1> 
   281                              <1>  %if %0 >= 2
   282                              <1>  mov ebx, %2
   283                              <1>  %if %0 >= 3
   284                              <1>  mov ecx, %3
   285                              <1>  %if %0 = 4
   286                              <1>  mov edx, %4
   287                              <1>  %endif
   288                              <1>  %endif
   289                              <1>  %endif
   290 000000BE B801000000          <1>  mov eax, %1
   291 000000C3 CD30                <1>  int 30h
   292                                  		; sys exit
   293                                  
   294                                  ; 04/12/2015 (14 byte file names)
   295                                  ;; 26 bytes listing (source) data
   296                                  ;; structure:
   297                                  ;; offset
   298                                  ;; 0-13  : file name
   299                                  ;; 14-15 : flags
   300                                  ;; 16-17 : nlinks, uid
   301                                  ;; 18-19 : size
   302                                  ;; 20-21-22-23 : mtime
   303                                  ;; 24-25 : inode number 
   304                                  
   305                                  do:
   306 000000C5 56                      	push	esi ; r5
   307 000000C6 29C0                    	sub 	eax, eax
   308 000000C8 A3[08090000]            	mov	[tblocks], eax ; 0
   309                                  		; clr tblocks
   310 000000CD BD[70130000]            	mov	ebp, _end
   311                                  		; mov $end,r1
   312 000000D2 BF[10090000]            	mov	edi, filnam
   313                                  		; mov $filnam,r3
   314 000000D7 891D[C9080000]          	mov	[dnp], ebx
   315                                  		; mov r4,dnp
   316 000000DD 89DE                    	mov	esi, ebx ; r4
   317 000000DF 66A3[06090000]          	mov	[isadir], ax ; 0
   318                                  		; clr isadir
   319 000000E5 663905[04090000]        	cmp	[dirflg], ax ; 0
   320                                  		; tst dirflg
   321 000000EC 0F87C1000000                    ja      nondir 
   322                                  		; bne nondir
   323                                  	;mov	ebx, [dnp]
   324 000000F2 B9[30090000]            	mov	ecx, statb
   325                                  	sys	_stat
   326                              <1> 
   327                              <1> 
   328                              <1> 
   329                              <1>  %if %0 >= 2
   330                              <1>  mov ebx, %2
   331                              <1>  %if %0 >= 3
   332                              <1>  mov ecx, %3
   333                              <1>  %if %0 = 4
   334                              <1>  mov edx, %4
   335                              <1>  %endif
   336                              <1>  %endif
   337                              <1>  %endif
   338 000000F7 B812000000          <1>  mov eax, %1
   339 000000FC CD30                <1>  int 30h
   340                                  		; sys stat; dnp: 0; statb
   341 000000FE 731B                    	jnc	short B1
   342                                  		; bec 1f
   343                                  	; EBX = file name address
   344 00000100 BE[0C010000]            	mov	esi, S8
   345                                  do_err:
   346 00000105 E8A8020000              	call	questf
   347 0000010A 5E                      	pop	esi
   348 0000010B C3                      	retn
   349                                  		;jsr r5,questf; < nonexistent\n\0>; .even
   350                                  		; rts pc
   351                                  S8:
   352 0000010C 206E6F6E6578697374-     	db	' nonexistent', 0Dh, 0Ah, 0
   353 00000115 656E740D0A00       
   354                                  
   355                                  B1: ;1:
   356                                  	;test	word [statb+2], 4000h
   357 0000011B F605[33090000]40        	test	byte [statb+3], 40h
   358                                  		; bit $40000,statb+2 /test directory
   359 00000122 0F848B000000                    jz      nondir
   360                                  		; beq nondir
   361 00000128 66FF05[06090000]        	inc	word [isadir]
   362                                  		; inc isadir
   363                                  	;mov	eax, ebx
   364                                  		; mov r4,r0
   365 0000012F 57                      	push	edi
   366 00000130 BF[52090000]            	mov	edi, dbuf
   367 00000135 E823050000              	call	fopen
   368                                  		; jsr r5,fopen; dbuf
   369 0000013A 5F                      	pop	edi
   370 0000013B 7315                    	jnc	short B2
   371                                  		; bcc 1f
   372                                  	; EBX = file name address
   373 0000013D BE[44010000]            	mov	esi, S9
   374 00000142 EBC1                    	jmp	short do_err
   375                                  	;call	questf
   376                                  	;pop	esi
   377                                  	;retn
   378                                  		; jsr r5,questf; < unreadable\n\0>; .even
   379                                  		; rts pc
   380                                  S9:
   381 00000144 20756E726561646162-     	db	' unreadable', 0Dh, 0Ah, 0
   382 0000014D 6C650D0A00         
   383                                  B2:
   384                                  	; mov	esi, ebx ; r4
   385                                  S10: ;1:
   386 00000152 AC                      	lodsb	  
   387 00000153 AA                      	stosb	 
   388                                  		;movb (r4)+,(r3)+
   389 00000154 08C0                    	or	al, al
   390 00000156 75FA                    	jnz	short S10
   391                                  		; bne 1b
   392 00000158 4F                      	dec	edi
   393                                  		; dec r3
   394                                  	;
   395 00000159 807FFF2F                	cmp 	byte [edi-1],'/'		
   396                                  		; cmpb -1(r3),$'/
   397 0000015D 7403                    	je	short B3
   398                                  		; beq 1f
   399 0000015F B02F                    	mov	al, '/'
   400 00000161 AA                      	stosb
   401                                  		; movb $'/,(r3)+
   402                                  B3: ;1:
   403                                  	;mov	ebx, dbuf
   404 00000162 BE[52090000]            	mov	esi, dbuf
   405                                  S11:
   406 00000167 E806050000              	call	getw
   407                                  		; jsr r5,getw; dbuf
   408 0000016C 726F                    	jc	short pass2
   409                                  		; bcs pass2
   410 0000016E B907000000              	mov	ecx, 7 ; 04/12/2015 (14 byte file names)
   411                                  		; mov $4,-(sp)
   412 00000173 6621C0                  	and	ax, ax
   413                                  		; tst r0
   414 00000176 750B                    	jnz	short B5
   415                                  		; bne 2f
   416                                  B4: ;3:
   417 00000178 51                      	push	ecx
   418                                  	; mov	esi, dbuf
   419 00000179 E8F4040000              	call	getw
   420                                  		; jsr r5,getw; dbuf
   421 0000017E 59                      	pop	ecx
   422 0000017F E2F7                    	loop	B4
   423                                  		; dec (sp)
   424                                  		; bne 3b
   425                                  		; tst (sp)+
   426 00000181 EBE4                    	jmp 	short S11
   427                                  	;jmp	short B3
   428                                  		; br 1b
   429                                  B5: ;2:
   430                                  	; EDI == r2
   431                                  		; mov r3,r2
   432 00000183 57                      	push	edi ; r3 (filnam +'/'+1)
   433                                  B6: ;2:
   434                                  	;; copying file name 
   435                                  	;; to listing (source) data address (ebp)
   436                                  	;; (offset 0-13) ; 04/12/2015 (14 byte file names)
   437                                  	;; and filnam (edi)
   438                                  	;
   439 00000184 51                      	push	ecx
   440                                  	; mov	esi, dbuf
   441 00000185 E8E8040000              	call	getw
   442                                  		; jsr r5,getw; dbuf
   443 0000018A 66894500                	mov	[ebp], ax
   444 0000018E 45                      	inc	ebp
   445 0000018F 45                      	inc	ebp
   446                                  		; mov r0,(r1)+
   447 00000190 66AB                    	stosw
   448                                  	;stosb
   449                                  		; movb r0,(r2)+
   450                                  	;xchg	al, ah
   451                                  		; swab r0
   452                                  	;stosb
   453                                  		; movb r0,(r2)+
   454 00000192 59                      	pop	ecx
   455 00000193 E2EF                    	loop	B6
   456                                  		; dec (sp)
   457                                  		; bne 2b
   458                                  		; tst (sp)+
   459 00000195 31C0                    	xor	eax, eax ; 0
   460 00000197 AA                      	stosb
   461                                  		; clrb (r2)+
   462 00000198 5F                      	pop	edi ; r3
   463 00000199 663905[02090000]        	cmp	[allflg], ax ; 0
   464                                  		; tst allflg
   465 000001A0 770A                    	ja	short B7
   466                                  		; bne 2f
   467 000001A2 803F2E                  	cmp	byte [edi], '.'
   468                                  		; cmpb (r3),$'.
   469 000001A5 7505                    	jne	short B7
   470                                  		; bne 2f
   471 000001A7 83ED0E                  	sub	ebp, 14 ; 04/12/2015 (14 byte file names)
   472                                  		; sub $8.,r1
   473 000001AA EBBB                    	jmp	short S11
   474                                  	;jmp	short B3
   475                                  		; br 1b
   476                                  B7: ;2:
   477                                  	;; copying 12 bytes inode data to
   478                                  	;; listing (source) data from offset
   479                                  	;; 14 to offset 25 (of 26 data bytes)
   480                                  	; 
   481 000001AC E88B030000              	call	gstat
   482                                  		; jsr r5,gstat
   483 000001B1 EBAF                    	jmp	short B3
   484                                  		; br 1b
   485                                  
   486                                  nondir:
   487                                  	; mov	esi, ebx ; r4
   488 000001B3 89FB                    	mov	ebx, edi ; offset filnam
   489                                  	;mov	r3,r2
   490                                  S12: ;1:
   491                                  	; ESI points to file name (input)
   492 000001B5 AC                      	lodsb
   493 000001B6 AA                      	stosb
   494                                  		; movb (r4)+,(r2)+
   495 000001B7 20C0                    	and	al, al
   496 000001B9 75FA                    	jnz	short S12
   497                                  		; bne 1b
   498                                  S13: ;1:
   499 000001BB 39DF                    	cmp	edi, ebx ; offset filnam	
   500                                  		; cmp r2,r3
   501 000001BD 7607                    	jna	short S14
   502                                  		; blos	1f
   503 000001BF 4F                      	dec	edi
   504 000001C0 803F2F                  	cmp	byte [edi], '/'
   505                                                  ; cmpb -(r2),$'/
   506 000001C3 75F6                            jne     short S13
   507                                  		; bne 1b
   508 000001C5 47                      	inc	edi
   509                                  		; inc r2
   510                                  	;; EDI points to last name 
   511                                  	;; of the path (after "/")
   512                                  S14: ;1:
   513 000001C6 B90E000000              	mov	ecx, 14 ; 04/12/2015 (14 byte file names)
   514                                  		; mov $8.,-(sp)
   515                                  ndloop: ;1:
   516 000001CB 8A07                    	mov	al, [edi]
   517 000001CD 884500                  	mov	[ebp], al
   518 000001D0 45                      	inc	ebp
   519                                  		; movb (r2)+,(r1)+
   520                                  		; bne 2f
   521                                  		; dec r2
   522 000001D1 08C0                    	or	al, al
   523 000001D3 7401                    	jz	short S15
   524 000001D5 47                      	inc	edi
   525                                  S15:
   526 000001D6 E2F3                    	loop	ndloop
   527 000001D8 E85F030000              	call	gstat ; fill/get 12 bytes listing data
   528                                  	;jmp	short pass2
   529                                  S16: ;2:
   530                                  		; dec (sp)	
   531                                  		; bne 1b
   532                                  		; jsr r5,gstat
   533                                  		; tst (sp)+
   534                                  
   535                                  pass2:
   536 000001DD 0FB71D[52090000]        	movzx	ebx, word [dbuf]
   537                                  		; mov dbuf,r0
   538                                  	sys	_close
   539                              <1> 
   540                              <1> 
   541                              <1> 
   542                              <1>  %if %0 >= 2
   543                              <1>  mov ebx, %2
   544                              <1>  %if %0 >= 3
   545                              <1>  mov ecx, %3
   546                              <1>  %if %0 = 4
   547                              <1>  mov edx, %4
   548                              <1>  %endif
   549                              <1>  %endif
   550                              <1>  %endif
   551 000001E4 B806000000          <1>  mov eax, %1
   552 000001E9 CD30                <1>  int 30h
   553                                  		; sys close
   554 000001EB 89D9                    	mov	ecx, ebx ; file descriptor
   555 000001ED BB[70130000]            	mov	ebx, _end
   556                                  		; mov $end,r2
   557 000001F2 39DD                    	cmp	ebp, ebx  ; ebp >= _end (= last word + 4)
   558                                  		; cmp r1,r2
   559 000001F4 7502                    	jne	short C1
   560                                  		; bne 1f
   561 000001F6 5E                      	pop	esi ; r5
   562 000001F7 C3                      	retn
   563                                  		; rts pc
   564                                  C1: ;1:
   565                                  ; sorting begins here
   566                                  		; mov r5,-(sp)
   567 000001F8 89EF                    	mov 	edi, ebp ; current end of listing words (+4)
   568 000001FA 55                      	push	ebp ; r1 
   569                                  		; mov r1,-(sp)
   570                                  	; EBX will point to mtime or file name (+14 or 0)
   571                                  	; offset of 26 bytes listing (source) data 
   572 000001FB 031D[0C090000]          	add	ebx, [sortoff] 
   573                                  		; add sortoff,r2
   574                                  C2: ;1:
   575 00000201 89D8                    	mov	eax, ebx
   576 00000203 AB                      	stosd
   577                                  		; mov r2,(r1)+
   578                                  	; 04/12/2015 (20 -> 26)
   579 00000204 83C31A                  	add	ebx, 26	; EBX now points to next 26 bytes
   580                                  		; add $20.,r2
   581 00000207 39EB                    	cmp	ebx, ebp ; is EBX passed the data limit ?
   582                                  		; cmp r2,(sp)
   583 00000209 72F6                    	jb	short C2
   584                                  		; blo 1b
   585                                  S17:
   586 0000020B 89EB                    	mov	ebx, ebp
   587                                  		; mov (sp),r2
   588 0000020D 83EF04                  	sub	edi, 4
   589                                  		; tst -(r1)
   590                                  C3: ;1:
   591 00000210 89FA                    	mov	edx, edi ; r1
   592                                  S18:
   593                                  	;mov	ebp, ebx
   594                                  		; mov r2,r3
   595                                  C4: ;2:
   596 00000212 83C504                  	add	ebp, 4
   597                                  		; tst (r3)+
   598 00000215 39D5                    	cmp	ebp, edx
   599                                  		; cmp r3,r1
   600 00000217 7724                    	ja	short C7
   601                                  		; bhi 2f
   602 00000219 8B33                    	mov	esi, [ebx] ; file name 1 or time 1
   603                                  		; mov (r2),r4
   604 0000021B 8B7D00                  	mov	edi, [ebp] ; file name 2 or time 2
   605                                  		; mov (r3),r5
   606 0000021E 833D[0C090000]00                cmp     dword [sortoff], 0
   607                                  		; tst sortoff
   608 00000225 7605                    	jna	short C5
   609                                  		; beq 4f
   610                                  
   611                                  ; sorting by modification time
   612 00000227 A7                      	cmpsd
   613 00000228 7209                    	jb	short C6
   614                                  		; cmp (r4)+,(r5)+
   615                                  		; blo 3f
   616                                  		; bhi 2b
   617                                  		; cmp (r4)+,(r5)+
   618                                  		; blo 3f
   619 0000022A EBE6                    	jmp	short C4
   620                                  		; br 2b
   621                                  
   622                                  ; sorting by file name
   623                                  C5: ;4:
   624                                  	; ?
   625                                  	;; mov	ecx, 14 ; 04/12/2015 (14 byte file names)
   626                                  ;C5x: ;4:
   627 0000022C A6                      	cmpsb	
   628                                  		; cmpb (r4)+,(r5)+
   629 0000022D 7704                    	ja	short C6
   630                                  		; bhi 3f
   631 0000022F 72E1                    	jb	short C4
   632                                  		; blo 2b
   633                                  	;dec	ecx ; ?
   634                                  		; dec r0
   635                                  	;jnz short C5x ; ?
   636                                  	;jmp	short C5x
   637 00000231 EBF9                    	jmp	short C5
   638                                  		; br 4b
   639                                  C6: ;3:
   640                                  	; 05/10/2015
   641 00000233 8B4500                  	mov	eax, [ebp]
   642 00000236 8703                    	xchg	eax, [ebx]
   643 00000238 894500                  	mov	[ebp], eax
   644                                  		; mov (r2),-(sp)
   645                                  		; mov (r3),(r2)
   646                                  		; mov (sp)+,(r3)
   647 0000023B EBD5                    	jmp	short C4
   648                                  		; br 2b
   649                                  C7: ;2:
   650 0000023D 83C304                  	add	ebx, 4
   651                                  		; tst (r2)+
   652 00000240 39D3                    	cmp	ebx, edx
   653                                  		; cmp r2,r1
   654                                  	;jb	short S18
   655                                  	;jb	short C3
   656                                  		; blo 1b
   657                                  	;
   658 00000242 7304                    	jnb	short C8
   659 00000244 89DD                    	mov	ebp, ebx
   660 00000246 EBCA                            jmp     short S18
   661                                  C8: ;1:
   662                                  ; end of sorting
   663 00000248 5D                      	pop	ebp ; r1 -> r2
   664                                  		; mov (sp)+,r2
   665                                  		; mov (sp)+,r5
   666                                  	
   667                                  	; BP = R2
   668                                  pass3:
   669                                  	; DX = R1 -> 'eol:' points to end of the list
   670 00000249 8915[F6080000]          	mov	[eol], edx ; save dx/r1
   671                                  	;
   672 0000024F 66833D[FE080000]01      	cmp	word [ocount], 1
   673                                  		; cmp ocount,$1
   674 00000257 7E1F                    	jng	short E1
   675                                  		; ble 1f
   676 00000259 66833D[06090000]00      	cmp	word [isadir], 0
   677                                  		; tst isadir
   678 00000261 7648                    	jna	short E2
   679                                  		; beq 2f
   680 00000263 8B35[C9080000]          	mov	esi, [dnp]
   681                                  		; mov dnp,0f
   682 00000269 E837010000              	call	pstring
   683                                  		; jsr r5,pstring; 0:..
   684 0000026E BE[F2080000]            	mov	esi, colon
   685                                  		; jsr r5,pstring; colon
   686 00000273 E82D010000              	call	pstring
   687                                  E1: ;1:
   688 00000278 66833D[00090000]00      	cmp	word [longf], 0
   689                                  		; tst longf
   690 00000280 0F8694000000                    jna     E10
   691                                  		; beq 1f
   692 00000286 BE[DA080000]            	mov	esi, totmes
   693 0000028B E815010000              	call	pstring
   694                                  		; jsr r5,pstring; totmes
   695 00000290 A1[08090000]            	mov	eax, [tblocks]
   696                                  		; mov tblocks,r0
   697 00000295 BB04000000              	mov	ebx, 4
   698 0000029A E82F030000              	call	decimal
   699                                  		; jsr r5,decimal; 4
   700 0000029F BE[D7080000]            	mov	esi, nl
   701 000002A4 E8FC000000              	call	pstring
   702                                  		; jsr r5,pstring; nl
   703 000002A9 EB09                            jmp     short S19
   704                                  E2: ;2:
   705 000002AB 803D[00090000]00        	cmp	byte [longf], 0
   706                                  		; tstb longf
   707 000002B2 7666                    	jna	short E10
   708                                  		; beq 1f
   709                                  S19:	
   710 000002B4 BB[E6080000]            	mov	ebx, passwd
   711                                  		; mov $passwd,r0
   712 000002B9 BF[68110000]            	mov	edi, iobuf
   713 000002BE E89A030000              	call	fopen
   714                                  		; jsr r5,fopen; iobuf
   715 000002C3 7255                    	jc	short E10
   716                                  		; bes 1f
   717 000002C5 BF[680D0000]            	mov	edi, uidbuf
   718                                  		; mov $uidbuf,r3
   719                                  E3: ;3:
   720                                  	; ?
   721                                  E4: ;2:
   722 000002CA BE[68110000]            	mov	esi, iobuf
   723                                  S20:
   724 000002CF E8B3030000              	call	getc
   725                                  		; jsr r5,getc; iobuf
   726 000002D4 7230                    	jc	short E9
   727                                  		; bes 3f
   728 000002D6 AA                      	stosb
   729                                  		; movb r0,(r3)+
   730 000002D7 3C3A                    	cmp	al, ':'
   731                                  		; cmpb r0,$':
   732 000002D9 75EF                    	jne	short E4
   733                                  		; bne 2b
   734                                  E5: ;2:
   735                                  	;mov	esi, iobuf
   736 000002DB E8A7030000              	call	getc
   737                                  		; jsr r5,getc; iobuf
   738 000002E0 3C3A                    	cmp	al, ':'
   739                                  		; cmpb r0,$':
   740 000002E2 75F7                    	jne	short E5
   741                                  		; bne 2b
   742                                  E6: ;2:
   743                                  	;mov	esi, iobuf
   744 000002E4 E89E030000              	call	getc
   745                                  		; jsr r5,getc; iobuf
   746 000002E9 3C3A                    	cmp	al, ':'
   747                                  		; cmpb r0,$':
   748 000002EB 7403                    	je	short E7
   749                                  		; bne 2b
   750 000002ED AA                      	stosb
   751                                  		; movb r0,(r3)+
   752 000002EE EBF4                    	jmp	short E6
   753                                  		; br 2b
   754                                  E7: ;2:
   755 000002F0 B00D                    	mov	al, 0Dh
   756 000002F2 AA                      	stosb
   757                                  		; movb $'\n,(r3)+
   758 000002F3 81FF[68110000]          	cmp	edi, euidbuf
   759                                  		; cmp r3,$euidbuf
   760 000002F9 730B                    	jnb	short E9
   761                                  		; bhis 3f
   762                                  E8: ;2:
   763                                  	;mov	esi, iobuf
   764 000002FB E887030000              	call	getc
   765                                  		; jsr r5,getc; iobuf
   766 00000300 3C0D                    	cmp	al, 0Dh ; end of line 
   767                                  		; cmpb r0,$'\n
   768 00000302 75F7                    	jne	short E8
   769                                  		; bne 2b
   770                                  	;jmp	short E3
   771                                  		; br 3b
   772 00000304 EBC9                            jmp     short S20
   773                                  E9: ;3:
   774 00000306 893D[D1080000]          	mov	[euids], edi
   775                                  		; mov r3,euids
   776                                  	; 07/10/2015 (32 bit modification)
   777                                  	; Retro UNIX 8086 v1 modification !!!
   778 0000030C 0FB71D[68110000]        	movzx	ebx,  word [iobuf]
   779                                  	; ??? (file descriptor ???)
   780                                  	; Original unix v1 'ls.s' has/had source
   781                                  	; code defect here !!!
   782                                  	sys	_close
   783                              <1> 
   784                              <1> 
   785                              <1> 
   786                              <1>  %if %0 >= 2
   787                              <1>  mov ebx, %2
   788                              <1>  %if %0 >= 3
   789                              <1>  mov ecx, %3
   790                              <1>  %if %0 = 4
   791                              <1>  mov edx, %4
   792                              <1>  %endif
   793                              <1>  %endif
   794                              <1>  %endif
   795 00000313 B806000000          <1>  mov eax, %1
   796 00000318 CD30                <1>  int 30h
   797                                  		; sys close
   798                                  E10: ;1:
   799                                  	; BP = R2
   800                                  	; [eol]  = end of the list 
   801                                  	;       (= r1 in original unix v1 'ls.s')
   802 0000031A 3B2D[F6080000]          	cmp	ebp, [eol]
   803                                  		; cmp r2,r1
   804 00000320 7730                    	ja	short E14
   805                                  		; bhi 1f
   806 00000322 8B7500                  	mov	esi, [ebp]
   807 00000325 83C504                  	add	ebp, 4
   808                                  		; mov (r2)+,r3
   809 00000328 2B35[0C090000]          	sub	esi, [sortoff]
   810                                  		; sub sortoff,r3
   811                                  	;;
   812                                  	;; ESI points to filename offset (0)
   813                                  	;; of the listing (source) data (26 bytes)
   814                                  	;
   815 0000032E E83F000000              	call	pentry
   816                                  		; jsr r5,pentry
   817                                  	;
   818 00000333 B90E000000              	mov	ecx, 14 ; 04/12/2015 (14 byte file names)
   819                                  		; mov $8.,-(sp)
   820                                  	;; print/write file name (on the end of
   821                                  	;; the listing row (after time string)
   822                                  E11: ;2:
   823 00000338 AC                      	lodsb
   824                                  		; movb (r3)+,r0
   825 00000339 08C0                    	or	al, al
   826 0000033B 7409                            jz      short E13
   827                                  		; beq 2f
   828 0000033D 51                      	push	ecx
   829                                  	;mov	ebx, obuf
   830 0000033E E8D9020000              	call	putc
   831                                  		; jsr r5,putc; obuf
   832 00000343 59                      	pop	ecx
   833 00000344 E2F2                    	loop	E11
   834                                  		; dec (sp)
   835                                  		; bne 2b
   836                                  E13: ;2:
   837                                  		; tst (sp)+
   838 00000346 BE[D7080000]            	mov	esi, nl ; new line
   839 0000034B E855000000              	call	pstring	
   840                                  		; jsr r5,pstring; nl
   841 00000350 EBC8                    	jmp	short E10
   842                                  		; br 1b
   843                                  E14: ;1:
   844 00000352 66833D[FE080000]01      	cmp	word [ocount], 1
   845                                  		; cmp ocount,$1
   846 0000035A 7E14                    	jng	short E15
   847                                  		; ble 1f
   848 0000035C 66833D[06090000]00      	cmp	word [isadir], 0
   849                                  		; tst isadir
   850 00000364 740A                    	je	short E15
   851                                  		; beq 1f
   852 00000366 BE[D7080000]            	mov	esi, nl
   853 0000036B E835000000              	call	pstring
   854                                  		; jsr r5,pstring; nl
   855                                  E15: ;1:
   856 00000370 5E                      	pop 	esi	; r5	
   857 00000371 C3                      	retn
   858                                  		; rts pc
   859                                  
   860                                  pentry:
   861                                  		;mov r2,-(sp)
   862 00000372 803D[00090000]00        	cmp	byte [longf], 0
   863                                  		; tstb longf
   864 00000379 7742                    	ja	short listl
   865                                  		; bne listl
   866 0000037B 803D[01090000]00        	cmp	byte [longf+1], 0
   867                                  		; tstb longf+1
   868 00000382 7701                    	ja	short S21
   869                                  		; bne 2f
   870                                  		; mov (sp)+,r2
   871 00000384 C3                      	retn
   872                                  		; rts r5
   873                                  S21: ;2:
   874 00000385 0FB74612                	movzx	eax, word [esi+18] ; 04/12/2015 (+12 -> +18)
   875                                  		; mov 12.(r3),r0
   876 00000389 E87D020000              	call	calcb
   877                                  		; jsr r5,calcb
   878 0000038E 56                      	push	esi
   879 0000038F BB03000000              	mov	ebx, 3
   880 00000394 E835020000              	call	decimal
   881                                  		; jsr r5,decimal; 3
   882 00000399 E802000000              	call	_pstring
   883                                  		; jsr r5,pstring; space
   884                                  		; mov (sp)+,r2
   885 0000039E 5E                      	pop	esi
   886 0000039F C3                      	retn
   887                                  		; rts r5
   888                                  
   889                                  _pstring:
   890 000003A0 BE[E4080000]            	mov	esi, space
   891                                  
   892                                  pstring:
   893                                  		; mov r5,-(sp)
   894                                  		; mov (r5),r5
   895                                  S22: ;1:
   896 000003A5 AC                      	lodsb
   897                                  		; movb (r5)+,r0
   898 000003A6 20C0                    	and	al, al
   899 000003A8 7407                    	jz	short S23
   900                                  		; beq 1f
   901                                  	;mov	ebx, obuf
   902 000003AA E86D020000              	call	putc	
   903                                  		; jsr r5,putc; obuf
   904 000003AF EBF4                    	jmp	short S22
   905                                  		; br 1b
   906                                  S23: ;1:
   907 000003B1 C3                      	retn
   908                                  		; mov (sp)+,r5
   909                                  		; tst (r5)+
   910                                  		; rts r5
   911                                  
   912                                  questf:
   913 000003B2 56                      	push	esi
   914 000003B3 89DE                    	mov	esi, ebx
   915                                  		; mov r4,0f
   916 000003B5 E8EBFFFFFF              	call	pstring
   917                                  		; jsr r5,pstring; 0:..
   918 000003BA 5E                      	pop	esi
   919                                  		; mov r5,0f
   920                                  	;call	pstring
   921                                  		; jsr r5,pstring; 0:..
   922                                  	;retn
   923                                  	;
   924 000003BB EBE8                    	jmp	short pstring
   925                                  ;1:
   926                                  		; tstb	(r5)+
   927                                  		; bne	1b
   928                                  		; inc	r5
   929                                  		; bic	$1,r5
   930                                  		; rts	r5
   931                                  listl:
   932                                  	; 06/10/2015 (32 bit modifications)
   933 000003BD 0FB74618                	movzx	eax, word [esi+24] ; 04/12/2015 (+18 -> +24)
   934                                                  ; mov 18.(r3),r0  / inode
   935 000003C1 56                      	push	esi ; r3
   936 000003C2 BB04000000              	mov	ebx, 4
   937 000003C7 E802020000              	call	decimal
   938                                  		; jsr r5,decimal; 4
   939 000003CC E8CFFFFFFF              	call	_pstring
   940                                  		; jsr r5,pstring; space
   941                                  
   942 000003D1 5E                      	pop	esi ; r3
   943 000003D2 89F7                    	mov	edi, esi
   944                                  		; mov r3,r4
   945 000003D4 83C70E                  	add	edi, 14 ; 04/12/2015 (8 -> 14)
   946                                  		; add $8.,r4 / get to flags
   947 000003D7 F6470110                	test	byte [edi+1], 10h
   948                                  	;test	word [edi], 1000h
   949                                  		; bit $10000,(r4) /large
   950 000003DB 7409                    	jz	short F1
   951                                  		; beq 2f
   952 000003DD B06C                    	mov	al, 'l'
   953 000003DF E838020000              	call	mode
   954                                  		; jsr r5,mode; 'l
   955 000003E4 EB07                    	jmp	short F2
   956                                  		; br 3f
   957                                  F1: ;2:
   958 000003E6 B073                    	mov	al, 's'
   959 000003E8 E82F020000              	call	mode
   960                                  		; jsr r5,mode; 's
   961                                  F2: ;3:
   962 000003ED F6470140                	test	byte [edi+1], 40h
   963                                  	;test	word [edi], 4000h 
   964                                  		; bit $40000,(r4) /directory
   965 000003F1 7409                    	jz	short F3
   966                                  		; beq 2f
   967 000003F3 B064                    	mov	al, 'd'
   968 000003F5 E822020000              	call	mode
   969                                  		; jsr r5,mode; 'd
   970 000003FA EB21                    	jmp	short F6
   971                                  		; br 3f
   972                                  F3: ;2:
   973 000003FC F60720                  	test	byte [edi], 20h 
   974                                  		; bit $40,(r4)  /set uid
   975 000003FF 7409                    	jz	short F4
   976                                  		; beq 2f
   977 00000401 B075                    	mov	al, 'u'
   978 00000403 E814020000              	call	mode
   979                                  		; jsr r5,mode; 'u
   980 00000408 EB13                    	jmp	short F6
   981                                  		; br 3f
   982                                  F4: ;2:
   983 0000040A F60710                  	test	byte [edi], 10h
   984                                  		; bit $20,(r4)   /executable
   985 0000040D 7409                    	jz	short F5
   986                                  		; beq 2f
   987 0000040F B078                    	mov	al, 'x'
   988 00000411 E806020000              	call	mode
   989                                  		; jsr r5,mode; 'x
   990 00000416 EB05                    	jmp	short F6
   991                                  		; br 3f
   992                                  F5: ;2:
   993 00000418 E8FD010000              	call	_mode
   994                                  		; jsr r5,mode; '-
   995                                  F6: ;3:
   996 0000041D F60708                  	test	byte [edi], 8
   997                                  		; bit $10,(r4)  /read owner
   998 00000420 7409                    	jz	short F7
   999                                  		; beq 2f
  1000 00000422 B072                    	mov	al, 'r'
  1001 00000424 E8F3010000              	call	mode
  1002                                  		; jsr r5,mode; 'r
  1003 00000429 EB05                    	jmp	short F8
  1004                                  		; br 3f
  1005                                  F7: ;2:
  1006 0000042B E8EA010000              	call	_mode
  1007                                                  ; jsr r5, mode; '-
  1008                                  F8: ;3:
  1009 00000430 F60704                  	test	byte [edi], 4
  1010                                  		; bit $4,(r4)  /write owner
  1011 00000433 7409                    	jz	short F9
  1012                                  		; beq 2f
  1013 00000435 B077                    	mov	al, 'w'
  1014 00000437 E8E0010000              	call	mode
  1015                                  		; jsr r5,mode; 'w
  1016 0000043C EB05                    	jmp	short F10
  1017                                  		; br 3f
  1018                                  F9: ;2:
  1019 0000043E E8D7010000              	call	_mode
  1020                                  		; jsr r5,mode; '-
  1021                                  F10: ;3:
  1022 00000443 F60702                  	test	byte [edi], 2
  1023                                  		; bit $2,(r4)  /read non-owner
  1024 00000446 7409                    	jz	short F11
  1025                                  		; beq 2f
  1026 00000448 B072                    	mov	al, 'r'
  1027 0000044A E8CD010000              	call	mode
  1028                                  		; jsr r5,mode; 'r
  1029 0000044F EB05                    	jmp	short F12
  1030                                  		; br 3f
  1031                                  F11: ;2:
  1032 00000451 E8C4010000              	call	_mode
  1033                                  		; jsr r5,mode; '-
  1034                                  F12: ;3:
  1035 00000456 F60701                  	test	byte [edi], 1 ; (r4)
  1036                                  		; bit $1,(r4)+  /write non-owner
  1037 00000459 7409                    	jz	short F13
  1038                                  		; beq 2f
  1039 0000045B B077                    	mov	al, 'w'
  1040 0000045D E8BA010000              	call	mode
  1041                                  		; jsr r5,mode; 'w
  1042 00000462 EB05                    	jmp	short F14
  1043                                  		; br 3f
  1044                                  F13: ;2:
  1045 00000464 E8B1010000              	call	_mode
  1046                                  		; jsr r5,mode; '-
  1047                                  F14: ;3:
  1048 00000469 56                      	push	esi ; r3
  1049 0000046A E831FFFFFF              	call	_pstring
  1050                                  		; jsr r5,pstring; space
  1051                                  	; inc 	edi, 4 ;; (r4)+
  1052                                  	; inc 	edi ;;
  1053 0000046F 89FE                    	mov	esi, edi
  1054 00000471 66AD                    	lodsw	; (r4)+
  1055 00000473 AC                      	lodsb	;; nlinks	
  1056 00000474 0FB6C0                  	movzx	eax, al
  1057                                  		; movb (r4)+,r0
  1058 00000477 BB02000000              	mov	ebx, 2
  1059 0000047C E845010000              	call	_decimal
  1060                                  		; jsr r5,decimal; 2
  1061 00000481 AC                      	lodsb	;; uid
  1062                                  		; movb (r4)+,r2
  1063 00000482 E835000000              	call	puid
  1064                                  		; jsr pc,puid
  1065 00000487 66AD                    	lodsw	;; size
  1066                                  		; mov (r4)+,r0
  1067                                  	;movzx	eax, ax
  1068 00000489 BB05000000                      mov     ebx, 5
  1069 0000048E E833010000              	call	_decimal
  1070                                  		; jsr r5,decimal; 5
  1071 00000493 56                              push    esi
  1072 00000494 E807FFFFFF              	call	_pstring
  1073                                  		; jsr r5,pstring; space
  1074 00000499 5E                              pop     esi
  1075                                  		; mov r1,-(sp)
  1076 0000049A 8B1D[F6080000]                  mov     ebx, [eol] ;r1
  1077 000004A0 AD                              lodsd   ; mtime
  1078                                         		; mov (r4)+,r0
  1079                                  		; mov (r4)+,r1
  1080                                  		; sub $16.,sp
  1081                                  		; mov sp,r2
  1082                                          ; EAX = unix time (epoch)
  1083 000004A1 E81E020000              	call	ctime
  1084                                  		; jsr pc,ctime
  1085                                  		; mov sp,r2
  1086 000004A6 B919000000              	mov	ecx, 25
  1087                                  	;;mov	ecx, 15
  1088                                  		; mov $15.,-(sp)
  1089 000004AB BE[A9080000]            	mov	esi, cbuf
  1090                                  F15: ;1:
  1091 000004B0 51                      	push	ecx
  1092 000004B1 AC                      	lodsb
  1093                                  		; movb (r2)+,r0
  1094                                  	;mov	ebx, obuf
  1095 000004B2 E865010000              	call	putc
  1096                                  		; jsr r5,putc; obuf
  1097 000004B7 59                      	pop	ecx
  1098 000004B8 E2F6                    	loop	F15
  1099                                  		; dec (sp)
  1100                                  		; bne 1b
  1101                                  		; add $18.,sp
  1102                                  		; mov (sp)+,r1
  1103                                  	;call	_pstring
  1104                                  		; jsr r5,pstring; space
  1105                                  		; mov (sp)+,r2
  1106 000004BA 5E                      	pop	esi ; r3
  1107 000004BB C3                      	retn
  1108                                  		; rts r5
  1109                                  
  1110                                  puid:
  1111                                  	; 06/10/2015 (32 bit modifications)
  1112                                  	; print user name
  1113                                  	; AL = user id/number
  1114 000004BC 56                      	push	esi ; r3
  1115                                  G0:
  1116 000004BD 50                      	push	eax ; r2
  1117                                  		; mov r1,-(sp)
  1118 000004BE BE[680D0000]            	mov 	esi, uidbuf
  1119                                  		; mov $uidbuf,r1
  1120                                  G1: ;1:
  1121                                  	;cmp	esi, euids
  1122                                  		; cmp r1,euids
  1123                                  	;jnb	short G8
  1124                                  		; bhis 1f
  1125 000004C3 56                      	push	esi ; 0:
  1126                                  		; mov r1,0f
  1127                                  G2: ;2:
  1128 000004C4 AC                      	lodsb
  1129 000004C5 20C0                    	and	al, al	
  1130                                  		; tstb (r1)+
  1131 000004C7 7409                    	jz 	short G3
  1132                                  		; beq 3f
  1133 000004C9 3C3A                    	cmp	al, ':'
  1134                                  		; cmpb -1(r1),$':
  1135 000004CB 75F7                    	jne	short G2
  1136                                  		; bne 2b
  1137 000004CD 30C0                    	xor	al, al ; 0
  1138 000004CF 8846FF                  	mov	[esi-1], al  ;0
  1139                                  		; clrb -1(r1)
  1140                                  G3: ;3:
  1141 000004D2 31DB                    	xor	ebx, ebx
  1142                                  		; clr -(sp)
  1143                                  	;mov	ecx, 10
  1144 000004D4 B10A                    	mov	cl, 10
  1145                                  G4: ;3:
  1146 000004D6 AC                      	lodsb
  1147                                  		; movb (r1)+,r0
  1148 000004D7 2C30                    	sub	al, '0'
  1149                                  		; sub $'0,r0
  1150 000004D9 3C09                    	cmp	al, 9
  1151                                  		; cmp r0,$9.
  1152 000004DB 770A                    	ja	short G5
  1153                                  		; bhi 3f
  1154                                  		; mov r1,-(sp)
  1155                                  	; 07/10/2015
  1156 000004DD 0FB6C0                  	movzx	eax, al 
  1157 000004E0 93                      	xchg	eax, ebx
  1158                                  		; mov 2(sp),r1
  1159 000004E1 F7E1                    	mul	ecx	
  1160                                  		; mpy $10.,r1
  1161 000004E3 01C3                    	add	ebx, eax
  1162                                  		; add r0,r1
  1163                                  		; mov r1,2(sp)
  1164                                  		; mov (sp)+,r1
  1165 000004E5 EBEF                    	jmp	short G4
  1166                                  		; br 3b
  1167                                  G5: ;3:
  1168 000004E7 5E                      	pop	esi ; 0:
  1169 000004E8 58                      	pop	eax ; r2
  1170                                  		; mov (sp)+,r0
  1171 000004E9 39C3                    	cmp	ebx, eax	
  1172                                  		; cmp r0,r2
  1173                                  	;jne	short G1
  1174                                  		; bne 1b
  1175 000004EB 7425                            je      short S24
  1176 000004ED 81FB[D1080000]          	cmp	ebx, euids
  1177 000004F3 72C8                    	jb	short G0
  1178                                  	;jb	short G1
  1179                                  	;jmp	short G8
  1180                                  G8:
  1181 000004F5 50                      	push	eax ; r2/UID
  1182 000004F6 E8A5FEFFFF              	call	_pstring
  1183                                  		;jsr r5,pstring; space
  1184 000004FB 58                      	pop	eax
  1185                                  		; mov r2,r0
  1186 000004FC BB03000000              	mov	ebx, 3
  1187 00000501 E8C8000000              	call	decimal
  1188                                  		; jsr r5,decimal; 3
  1189 00000506 BE[E1080000]            	mov	esi, space3
  1190 0000050B E895FEFFFF              	call	pstring
  1191                                  		; jsr r5,pstring; space3
  1192 00000510 5E                      	pop	esi ; r3
  1193                                  		; mov (sp)+,r1
  1194 00000511 C3                      	retn
  1195                                  		; rts pc
  1196                                  S24:
  1197 00000512 56                      	push	esi ; 0:
  1198 00000513 E888FEFFFF              	call	_pstring
  1199                                  		; jsr r5,pstring; space
  1200 00000518 5E                      	pop	esi ; 0:
  1201 00000519 56                      	push	esi ; 0:
  1202 0000051A E886FEFFFF              	call	pstring
  1203                                  		; jsr r5,pstring; 0:..
  1204 0000051F 5E                      	pop	esi ; 0:
  1205                                  		; mov 0b,r1
  1206 00000520 66B90600                	mov	cx, 6
  1207                                  		; mov $6,-(sp)
  1208                                  G6: ;3:
  1209 00000524 AC                      	lodsb
  1210                                  		; tstb (r1)+
  1211 00000525 20C0                    	and	al, al
  1212 00000527 7404                    	jz	short G7
  1213                                  		; beq 3f
  1214 00000529 FEC9                    	dec	cl
  1215                                  		; dec (sp)
  1216 0000052B EBF7                    	jmp	short G6
  1217                                  		; br 3b
  1218                                  G7: ;3:
  1219 0000052D 6651                    	push	cx
  1220 0000052F E86CFEFFFF              	call	_pstring
  1221                                  		; jsr r5,pstring; space
  1222 00000534 6659                    	pop	cx
  1223 00000536 6649                    	dec	cx
  1224                                  		; dec (sp)
  1225 00000538 7FF3                    	jg	short G7	
  1226                                  		; bgt 3b
  1227                                  		; tst (sp)+
  1228 0000053A 5E                      	pop	esi ; r3
  1229                                  		; mov (sp)+,r1
  1230 0000053B C3                      	retn
  1231                                  		; rts pc
  1232                                  ;G8: ;1:
  1233                                  		;jsr r5,pstring; space
  1234                                  		; mov r2,r0
  1235                                  		; jsr r5,decimal; 3
  1236                                  		; jsr r5,pstring; space3
  1237                                  		; mov (sp)+,r1
  1238                                  		; rts pc
  1239                                  
  1240                                  ;_mode:
  1241                                  ;	mov	al, '-'
  1242                                  ;mode:
  1243                                  	; AL = mode char
  1244                                  		;mov	(r5)+,r0
  1245                                  	;mov	ebx, obuf
  1246                                  ;	call	putc
  1247                                  		; jsr r5,putc; obuf
  1248                                  ;	retn
  1249                                  		; rts r5
  1250                                  
  1251                                  gstat:
  1252                                  	; 06/10/2015 (32 bit modifications)
  1253 0000053C 55                      	push	ebp
  1254                                  		; mov r1,-(sp)
  1255 0000053D 81C500020000            	add	ebp, 512
  1256                                  		; add $512.,r1
  1257 00000543 3B2D[C5080000]          	cmp	ebp, [brk]
  1258                                  		; cmp r1,0f
  1259 00000549 720F                    	jb	short D1
  1260                                  		; blo 1f
  1261 0000054B 892D[C5080000]          	mov	[brk], ebp
  1262                                  		; mov r1,0f
  1263                                  	sys	_break, ebp ; sys _break, brk
  1264                              <1> 
  1265                              <1> 
  1266                              <1> 
  1267                              <1>  %if %0 >= 2
  1268 00000551 89EB                <1>  mov ebx, %2
  1269                              <1>  %if %0 >= 3
  1270                              <1>  mov ecx, %3
  1271                              <1>  %if %0 = 4
  1272                              <1>  mov edx, %4
  1273                              <1>  %endif
  1274                              <1>  %endif
  1275                              <1>  %endif
  1276 00000553 B811000000          <1>  mov eax, %1
  1277 00000558 CD30                <1>  int 30h
  1278                                  		; sys break; 0: end+512.
  1279                                  D1: ;1:
  1280 0000055A 5D                      	pop	ebp
  1281                                  		; mov (sp)+,r1
  1282 0000055B 31C0                    	xor	eax, eax
  1283                                  	; Detailed (Long) listing
  1284 0000055D 663905[00090000]        	cmp	[longf], ax ;0
  1285                                  		; tst longf
  1286 00000564 7708                    	ja	short D2
  1287                                  		; bne 2f
  1288                                  	; Sorting by modification time
  1289 00000566 3905[0C090000]          	cmp	[sortoff], eax ;0
  1290                                  		; tst sortoff
  1291 0000056C 761D                    	jna	short D4
  1292                                  		; beq 1f
  1293                                  D2: ;2:
  1294                                          sys     _stat, filnam, statb
  1295                              <1> 
  1296                              <1> 
  1297                              <1> 
  1298                              <1>  %if %0 >= 2
  1299 0000056E BB[10090000]        <1>  mov ebx, %2
  1300                              <1>  %if %0 >= 3
  1301 00000573 B9[30090000]        <1>  mov ecx, %3
  1302                              <1>  %if %0 = 4
  1303                              <1>  mov edx, %4
  1304                              <1>  %endif
  1305                              <1>  %endif
  1306                              <1>  %endif
  1307 00000578 B812000000          <1>  mov eax, %1
  1308 0000057D CD30                <1>  int 30h
  1309                                  		; sys stat; filnam; statb
  1310 0000057F 731C                    	jnc	short D3
  1311                                  		; bec 2f
  1312                                  		; mov r4,-(sp)
  1313                                  	;mov	ebx, filnam
  1314                                  		; mov $filnam,r4
  1315 00000581 BE[8F050000]            	mov	esi, S25
  1316 00000586 E827FEFFFF              	call	questf
  1317                                  		; jsr r5,questf; < unstatable\n\0>; .even
  1318                                  		; mov (sp)+,r4
  1319                                  D4:
  1320 0000058B 83C50C                  	add	ebp, 12
  1321                                  		; add $12.,r1
  1322 0000058E C3                      	retn
  1323                                  		; rts r5
  1324                                  S25:
  1325 0000058F 20756E737461746162-     	db	' unstatable', 0Dh, 0Ah, 0
  1326 00000598 6C650D0A00         
  1327                                  
  1328                                  D3: ;2:
  1329 0000059D 57                      	push	edi
  1330 0000059E 89EF                    	mov	edi, ebp
  1331 000005A0 BE[32090000]            	mov	esi, statb + 2
  1332                                  		; mov $statb+2,r0
  1333 000005A5 A5                      	movsd
  1334                                  		; mov (r0)+,(r1)+  /flags
  1335                                  		; mov (r0)+,(r1)+  /nlinks, uid
  1336                                  		; mov r0,-(sp)
  1337 000005A6 0FB706                  	movzx	eax, word [esi]
  1338                                  		; mov (r0),r0
  1339 000005A9 E85D000000              	call	calcb
  1340                                  		; jsr r5,calcb
  1341 000005AE 0105[08090000]          	add	[tblocks], eax
  1342                                  		; add r0,tblocks
  1343                                  		; mov (sp)+,r0
  1344 000005B4 66A5                    	movsw
  1345                                  		; mov (r0)+,(r1)+  /size
  1346 000005B6 83C614                  	add	esi, 20
  1347                                  		; add $20.,r0 	   /dska, ctim
  1348 000005B9 A5                      	movsd
  1349                                  		; mov (r0)+,(r1)+  /mtim
  1350                                  		; mov (r0)+,(r1)+
  1351 000005BA 66A1[30090000]          	mov	ax, [statb]
  1352 000005C0 66AB                    	stosw
  1353                                  		; mov statb,(r1)+ /inode
  1354 000005C2 89FD                    	mov	ebp, edi
  1355 000005C4 5F                      	pop	edi
  1356 000005C5 C3                      	retn
  1357                                  		; rts r5
  1358                                  ;D4: ;1:
  1359                                  ;	add	ebp, 12
  1360                                  		; add $12.,r1
  1361                                  ;	retn
  1362                                  		; rts	r5
  1363                                  
  1364                                  _decimal:
  1365 000005C6 56                      	push	esi
  1366 000005C7 E802000000              	call	decimal
  1367 000005CC 5E                      	pop	esi
  1368 000005CD C3                      	retn
  1369                                  	
  1370                                  decimal: 
  1371                                  ; convert number to decimal number chars
  1372                                  	; 5/10/2015 (32 bit modifications)
  1373                                  	; EAX = number to be converted
  1374                                  	; EBX = number of digits (=4)
  1375                                  		; mov r1,-(sp)
  1376                                  		; mov r2,-(sp)
  1377                                  		; mov r3,-(sp)
  1378                                  	;push	edi
  1379 000005CE 31D2                    	xor	edx, edx
  1380 000005D0 B906000000              	mov	ecx, 6
  1381                                  		; mov $6,r2
  1382 000005D5 BF[680D0000]            	mov	edi, numbuf + 6
  1383                                  		; mov $numbuf+6,r3
  1384 000005DA BE0A000000              	mov	esi, 10
  1385                                  S26: ;1:
  1386                                  	;and	eax, eax
  1387                                  	;jz	short S27
  1388                                  		;mov r0,r1
  1389                                  	;xor 	edx, edx
  1390                                  		; clr r0
  1391                                  	;mov	esi, 10		
  1392                                  		; dvd $10.,r0
  1393 000005DF F7F6                    	div	esi
  1394                                  ;S27:
  1395 000005E1 80C230                  	add	dl, '0'
  1396                                  		; add $'0,r1
  1397 000005E4 4F                      	dec	edi
  1398 000005E5 8817                    	mov	[edi], dl
  1399                                  		; movb r1,-(r3)
  1400 000005E7 30D2                    	xor	dl, dl
  1401 000005E9 E2F4                    	loop	S26
  1402                                  		; sob r2,1b
  1403 000005EB B020                    	mov	al, 20h ; space
  1404 000005ED B105                    	mov	cl, 5
  1405                                  S28: ;1:
  1406                                  	;cmp	edi, numbuf + 5
  1407                                  		; cmp r3,$numbuf+5
  1408                                  	;je	short S29
  1409                                  		; beq 1f
  1410 000005EF 803F30                  	cmp	byte [edi], '0'
  1411                                  		; cmpb (r3),$'0
  1412 000005F2 7503                    	jne	short S29
  1413                                  		; bne 1f
  1414                                  	;mov	al, 20h
  1415 000005F4 AA                      	stosb
  1416                                  		; movb $' ,(r3)+
  1417                                  	;jmp	short S28
  1418                                  		; br 1b
  1419 000005F5 E2F8                    	loop	S28
  1420                                  S29: ;1:
  1421 000005F7 BE[680D0000]            	mov	esi, numbuf + 6
  1422                                  		; mov $numbuf+6,r1
  1423 000005FC 29DE                    	sub	esi, ebx
  1424                                  		; sub (r5),r1
  1425                                  	;mov	ecx, ebx
  1426 000005FE 88D9                    	mov	cl, bl
  1427                                  		; mov (r5)+,-(sp)
  1428                                  S30: ;1:
  1429 00000600 51                      	push	ecx
  1430 00000601 AC                      	lodsb
  1431                                  		; movb (r1)+,r0
  1432                                  	;mov	ebx, obuf	
  1433 00000602 E815000000              	call	putc
  1434                                  		; jsr r5,putc; obuf
  1435 00000607 59                      	pop	ecx
  1436 00000608 E2F6                    	loop	S30
  1437                                  		; dec (sp)
  1438                                  		; bne 1b
  1439                                  		; tst (sp)+
  1440                                  		; mov (sp)+,r3
  1441                                  		; mov (sp)+,r2
  1442                                  		; mov (sp)+,r1
  1443                                  	;pop	edi
  1444 0000060A C3                      	retn
  1445                                  		; rts r5
  1446                                  
  1447                                  calcb:
  1448                                  	; 06/10/2015 (32 bit modifications)
  1449                                  	; calculate number of blocks
  1450 0000060B 05FF010000              	add	eax, 511
  1451 00000610 C1E809                  	shr	eax, 9 ; (eax+511)/512
  1452                                  		; add $511.,r0
  1453                                  		; clrb r0
  1454                                  		; swab r0
  1455                                  		; asr r0
  1456                                  	; eax = (size+511)/512
  1457                                  	; large file ? (>=4096 bytes)
  1458 00000613 83F808                  	cmp	eax, 8
  1459                                  		; cmp r0,$8
  1460 00000616 7201                    	jb	short S31
  1461                                  		; blo 1f
  1462                                  	; add indirect block
  1463 00000618 40                      	inc	eax	
  1464                                  		; inc r0
  1465                                  S31: ;1:
  1466                                      ;1: ; ?
  1467 00000619 C3                      	retn
  1468                                  		; rts r5
  1469                                  
  1470                                  _mode:
  1471 0000061A B02D                    	mov	al, '-'
  1472                                  mode:
  1473                                  	; AL = mode char
  1474                                  		;mov	(r5)+,r0
  1475                                  	;mov	ebx, obuf
  1476                                  ;	call	putc
  1477                                  		; jsr r5,putc; obuf
  1478                                  ;	retn
  1479                                  		; rts r5
  1480                                  
  1481                                  ; 'putc' procedure
  1482                                  ; is derived from 'put.s'
  1483                                  ; file of original UNIX v5
  1484                                  ;
  1485                                  ; write characters on output file
  1486                                  putc:
  1487                                  	; AL = character to be written
  1488                                  	; obuf = output buffer
  1489                                  	;; EBX = buffer address
  1490 0000061C 56                      	push 	esi
  1491                                  		;mov r1,-(sp)
  1492 0000061D BE[5A0B0000]            	mov 	esi, obuf
  1493                                  	;mov	esi, ebx
  1494                                  		;mov (r5)+,r1
  1495                                  S32: ;1:
  1496 00000622 66FF4E02                	dec	word [esi+2]
  1497                                  		; dec 2(r1)
  1498 00000626 7909                    	jns	short S33
  1499                                  		; bge 1f
  1500 00000628 50                      	push	eax	
  1501                                  		; mov r0,-(sp)
  1502 00000629 E80D000000              	call	fl
  1503                                  		; jsr pc,fl
  1504 0000062E 58                      	pop	eax
  1505                                  		; mov (sp)+,r0
  1506 0000062F EBF1                    	jmp	short S32
  1507                                  		; br 1b
  1508                                  S33: ;1:
  1509 00000631 8B5E04                  	mov	ebx, [esi+4]
  1510 00000634 8803                    	mov	[ebx], al
  1511                                  		; movb r0,*4(r1)
  1512 00000636 FF4604                  	inc	dword [esi+4]
  1513                                  		; inc 4(r1)
  1514 00000639 5E                      	pop	esi
  1515                                  		; mov (sp)+,r1
  1516 0000063A C3                      	retn
  1517                                  		; rts r5
  1518                                  
  1519                                  
  1520                                  ; 'flush' procedure
  1521                                  ; is derived from 'put.s'
  1522                                  ; file of original UNIX v5
  1523                                  
  1524                                  flush:
  1525                                  		; mov r0,-(sp)
  1526                                  		; mov r1,-(sp)
  1527                                  		; mov (r5)+,r1
  1528                                  		; jsr pc,fl
  1529                                  		; mov (sp)+,r1
  1530                                  		; mov (sp)+,r0
  1531                                  		; rts r5
  1532                                  fl:
  1533 0000063B 89F1                    	mov	ecx, esi
  1534                                  		; mov r1,r0
  1535 0000063D 83C108                  	add	ecx, 8
  1536                                  		; add $6,r0
  1537                                  	;push	ecx		; Buffer data address
  1538                                  		; mov r0,-(sp)
  1539                                  		; mov r0,0f
  1540 00000640 8B5604                  	mov	edx, [esi+4]	; Buffer offset
  1541                                  		; mov 4(r1),0f+2
  1542 00000643 09D2                    	or	edx, edx		   	
  1543 00000645 740C                    	jz	short S34
  1544                                  		; beq 1f
  1545 00000647 29CA                    	sub	edx, ecx	; Byte count
  1546                                  		; sub (sp),0f+2
  1547 00000649 0FB71E                  	movzx	ebx, word [esi] ; File descriptor (=1)
  1548                                  		; mov (r1),r0
  1549                                  	sys	_write ; sys _write, ebx, ecx, edx
  1550                              <1> 
  1551                              <1> 
  1552                              <1> 
  1553                              <1>  %if %0 >= 2
  1554                              <1>  mov ebx, %2
  1555                              <1>  %if %0 >= 3
  1556                              <1>  mov ecx, %3
  1557                              <1>  %if %0 = 4
  1558                              <1>  mov edx, %4
  1559                              <1>  %endif
  1560                              <1>  %endif
  1561                              <1>  %endif
  1562 0000064C B804000000          <1>  mov eax, %1
  1563 00000651 CD30                <1>  int 30h
  1564                                  		; sys 0; 9f
  1565                                  ;.data
  1566                                  ;9:
  1567                                  ;		; sys write; 0:..; ..
  1568                                  ;.text
  1569                                  S34: ;1:
  1570                                  	;pop	ecx
  1571 00000653 894E04                  	mov	[esi+4], ecx ; Begin. of buf. data
  1572                                  		; mov (sp)+,4(r1)
  1573 00000656 66C746020002            	mov	word [esi+2], 512 ; Buffer data size
  1574                                  		; mov $512.,2(r1)
  1575 0000065C C3                      	retn
  1576                                  		; rts	pc
  1577                                  
  1578                                  ; 'getw', 'getc' and 'fopen' procedures
  1579                                  ; are derived from 'get.s'
  1580                                  ; file of original UNIX v5
  1581                                  
  1582                                  ; open a file for use by get(c|w)
  1583                                  ;
  1584                                  fopen:
  1585                                  	; EBX = file name offset
  1586                                  	; EDI = buffer offset
  1587                                  	;
  1588 0000065D 31C9                    	xor 	ecx, ecx ; 0 => open for read	
  1589                                  	sys 	_open ; sys _open, ebx, ecx (0)
  1590                              <1> 
  1591                              <1> 
  1592                              <1> 
  1593                              <1>  %if %0 >= 2
  1594                              <1>  mov ebx, %2
  1595                              <1>  %if %0 >= 3
  1596                              <1>  mov ecx, %3
  1597                              <1>  %if %0 = 4
  1598                              <1>  mov edx, %4
  1599                              <1>  %endif
  1600                              <1>  %endif
  1601                              <1>  %endif
  1602 0000065F B805000000          <1>  mov eax, %1
  1603 00000664 CD30                <1>  int 30h
  1604 00000666 7203                    	jc	short S35
  1605 00000668 66AB                    	stosw  ; file descriptor (in buffer offset 0)
  1606 0000066A C3                      	retn
  1607                                  S35:
  1608 0000066B 66B8FFFF                	mov	ax, 0FFFFh ; -1
  1609 0000066F 66AB                    	stosw
  1610                                  	;stc
  1611 00000671 C3                      	retn
  1612                                  
  1613                                  ; get words from input file
  1614                                  ;
  1615                                  getw:
  1616                                  	;mov 	esi, ebx
  1617 00000672 E810000000              	call	getc
  1618 00000677 720D                    	jc	short S36
  1619                                  
  1620 00000679 6650                    	push	ax
  1621 0000067B E807000000              	call	getc	
  1622 00000680 665A                    	pop	dx
  1623 00000682 88D4                    	mov	ah, dl
  1624 00000684 86E0                    	xchg 	ah, al
  1625                                  S36:
  1626 00000686 C3                      	retn
  1627                                  
  1628                                  ; get characters from input file
  1629                                  ;
  1630                                  getc:
  1631                                  	; ESI = buffer address
  1632 00000687 668B4602                	mov	ax, [esi+2] ; char count
  1633 0000068B 6621C0                  	and	ax, ax
  1634 0000068E 751D                    	jnz	short gch1
  1635                                  gch0:
  1636 00000690 89F1                    	mov	ecx, esi
  1637 00000692 83C108                  	add	ecx, 8		; read buff. addr.
  1638 00000695 0FB71E                  	movzx	ebx, word [esi]
  1639 00000698 894E04                  	mov 	[esi+4], ecx ; char offset
  1640                                  	;xor	ax, ax
  1641                                  	;mov	[esi+2], ax ; 0
  1642 0000069B BA00020000              	mov 	edx, 512  
  1643                                  	sys	_read  ; sys _read, ebx, ecx, edx
  1644                              <1> 
  1645                              <1> 
  1646                              <1> 
  1647                              <1>  %if %0 >= 2
  1648                              <1>  mov ebx, %2
  1649                              <1>  %if %0 >= 3
  1650                              <1>  mov ecx, %3
  1651                              <1>  %if %0 = 4
  1652                              <1>  mov edx, %4
  1653                              <1>  %endif
  1654                              <1>  %endif
  1655                              <1>  %endif
  1656 000006A0 B803000000          <1>  mov eax, %1
  1657 000006A5 CD30                <1>  int 30h
  1658 000006A7 7216                    	jc	short gch2
  1659 000006A9 09C0                    	or	eax, eax
  1660 000006AB 7415                    	jz	short gch3
  1661                                  gch1:
  1662 000006AD 6648                    	dec	ax
  1663 000006AF 66894602                	mov	[esi+2], ax
  1664 000006B3 8B5E04                  	mov	ebx, [esi+4]
  1665 000006B6 8A03                    	mov	al, [ebx]
  1666 000006B8 43                      	inc	ebx
  1667 000006B9 895E04                  	mov	[esi+4], ebx
  1668 000006BC 30E4                    	xor	ah, ah
  1669 000006BE C3                      	retn 	
  1670                                  gch2:
  1671 000006BF 6631C0                  	xor	ax, ax
  1672                                  gch3:
  1673 000006C2 F9                      	stc
  1674 000006C3 C3                      	retn
  1675                                  
  1676                                  ;/ getw/getc -- get words/characters from input file
  1677                                  ;/ fopen -- open a file for use by get(c|w)
  1678                                  ;/
  1679                                  ;/ calling sequences --
  1680                                  ;/
  1681                                  ;/   mov $filename,r0
  1682                                  ;/   jsr r5,fopen; ioptr
  1683                                  ;/
  1684                                  ;/  on return ioptr buffer is set up or error bit is set if
  1685                                  ;/  file could not be opened.
  1686                                  ;/
  1687                                  ;/   jsr r5,get(c|w)1; ioptr
  1688                                  ;/
  1689                                  ;/  on return char/word is in r0; error bit is
  1690                                  ;/  set on error or end of file.
  1691                                  ;/
  1692                                  ;/  ioptr is the address of a 518-byte buffer
  1693                                  ;/  whose layout is as follows:
  1694                                  ;/
  1695                                  ;/  ioptr: .=.+2    / file descriptor
  1696                                  ;	   .=.+2  /// buffer size (This is noted by Erdogan Tan; 19/11/2013)	
  1697                                  ;/         .=.+2    / charact+2  / pointer to next character (reset if no. chars=0)
  1698                                  ;/         .=.+512. / the buffer
  1699                                  
  1700                                  ;	.globl	getc,getw,fopen
  1701                                  
  1702                                  ;fopen:
  1703                                  ;	mov	r1,-(sp)
  1704                                  ;	mov	(r5)+,r1
  1705                                  ;	mov	r0,0f
  1706                                  ;	sys	0; 9f
  1707                                  ;.data
  1708                                  ;9:
  1709                                  ;	sys	open; 0:..; 0
  1710                                  ;.text
  1711                                  ;	bes	1f
  1712                                  ;	mov	r0,(r1)+
  1713                                  ;	clr	(r1)+
  1714                                  ;	mov	(sp)+,r1
  1715                                  ;	rts	r5
  1716                                  ;1:
  1717                                  ;	mov	$-1,(r1)
  1718                                  ;	mov	(sp)+,r1
  1719                                  ;	sec
  1720                                  ;	rts	r5
  1721                                  ;
  1722                                  ;.data
  1723                                  ;getw:
  1724                                  ;	mov	(r5),9f
  1725                                  ;	mov	(r5)+,8f
  1726                                  ;	jsr	r5,getc; 8:..
  1727                                  ;	bec	1f
  1728                                  ;	rts	r5
  1729                                  ;1:
  1730                                  ;	mov	r0,-(sp)
  1731                                  ;	jsr	r5,getc; 9:..
  1732                                  ;	swab	r0
  1733                                  ;	bis	(sp)+,r0
  1734                                  ;	rts	r5
  1735                                  ;.text
  1736                                  ;
  1737                                  ;getc:
  1738                                  ;	mov	r1,-(sp)
  1739                                  ;	mov	(r5)+,r1
  1740                                  ;	dec	2(r1)
  1741                                  ;	bge	1f
  1742                                  ;	mov	r1,r0
  1743                                  ;	add	$6,r0
  1744                                  ;	mov	r0,0f
  1745                                  ;	mov	r0,4(r1)
  1746                                  ;	mov	(r1),r0
  1747                                  ;	sys	0; 9f
  1748                                  ;.data
  1749                                  ;9:
  1750                                  ;	sys	read; 0:..; 512.
  1751                                  ;.text
  1752                                  ;	bes	2f
  1753                                  ;	tst	r0
  1754                                  ;	bne	3f
  1755                                  ;2:
  1756                                  ;	mov	(sp)+,r1
  1757                                  ;	sec
  1758                                  ;	rts	r5
  1759                                  ;3:
  1760                                  ;	dec	r0
  1761                                  ;	mov	r0,2(r1)
  1762                                  ;1:
  1763                                  ;	clr	r0
  1764                                  ;	bisb	*4(r1),r0
  1765                                  ;	inc	4(r1)
  1766                                  ;	mov	(sp)+,r1
  1767                                  ;	rts	r5
  1768                                  
  1769                                  %include 'ctime386.inc' ; 24/11/2013
  1770                              <1> ; ****************************************************************************
  1771                              <1> ; ctime386.inc (Retro Unix 386 v1 - /bin/ls - list file or directory)
  1772                              <1> ; ----------------------------------------------------------------------------
  1773                              <1> ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
  1774                              <1> ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
  1775                              <1> ;
  1776                              <1> ; [ Last Modification: 06/10/2015 ]
  1777                              <1> ;
  1778                              <1> ; Derived from 'CTIME.INC' source code file of 'Retro UNIX 8086 v1'
  1779                              <1> ; operating system project, /bin/ls source code by Erdogan Tan
  1780                              <1> ; (28/11/2013)
  1781                              <1> ;
  1782                              <1> ; Derived from 'ctime.c' file of original UNIX v5 (usr/source/s3/ctime.c)
  1783                              <1> ;
  1784                              <1> ; ls386.s (ls0.s) 23/09/2015 - 06/10/2015
  1785                              <1> ; include ctime386.inc
  1786                              <1> ;
  1787                              <1> ; ****************************************************************************
  1788                              <1> 
  1789                              <1> ; Assembler: NASM 2.11
  1790                              <1> 
  1791                              <1> ;timezone equ 5*60*60
  1792                              <1> 
  1793                              <1> 
  1794                              <1> ctime:  ; ctime(at)
  1795                              <1> 	; int *at;
  1796                              <1> 	; {
  1797                              <1> 	; 	return(asctime(localtime(at)));
  1798                              <1> 	; }
  1799                              <1> 
  1800                              <1> 	; EAX = unix epoch time (in seconds)
  1801                              <1> 
  1802                              <1> 	;call localtime
  1803                              <1> 	;call asctime
  1804                              <1> 
  1805                              <1> 	;retn
  1806                              <1>   
  1807                              <1> localtime:
  1808                              <1> 	; localtime(tim)
  1809                              <1> 	; int tim[];
  1810                              <1> 	; 	{
  1811                              <1> 	;		register int *t, *ct, dayno;
  1812                              <1> 	;	int daylbegin, daylend;
  1813                              <1> 	;	int copyt[2];
  1814                              <1> 	;	t = copyt;
  1815                              <1> 	;	t[0] = tim[0];
  1816                              <1> 	;	t[1] = tim[1];
  1817                              <1> 	;	dpadd(t, -timezone);
  1818                              <1> 	;	ct = gmtime(t);
  1819                              <1> 	;	dayno = ct[YDAY];
  1820                              <1> 	;	if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
  1821                              <1> 	;	    dayno==5 && ct[HOUR]>=2))) {
  1822                              <1> 	;		daylight =| 1;
  1823                              <1> 	;		daylbegin = -1;
  1824                              <1> 	;		daylend = 367;
  1825                              <1> 	;	} else {
  1826                              <1> 	;		daylbegin = sunday(ct, 119);	/* last Sun in Apr */
  1827                              <1> 	;		daylend = sunday(ct, 303);	/* last Sun in Oct */
  1828                              <1> 	;	}
  1829                              <1> 	;	if (daylight &&
  1830                              <1> 	;	    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
  1831                              <1> 	;	    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
  1832                              <1> 	;		dpadd(t, 1*60*60);
  1833                              <1> 	;		ct = gmtime(t);
  1834                              <1> 	;		ct[ISDAY]++;
  1835                              <1> 	;	}
  1836                              <1> 	;	return(ct);
  1837                              <1> 	;	}
  1838                              <1> 
  1839                              <1> 	;sub	eax, timezone	
  1840                              <1> 
  1841                              <1> 	;push	eax
  1842                              <1> 
  1843 000006C4 E885000000          <1> 	call 	gmtime
  1844                              <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
  1845                              <1> ;     dayno==5 && ct[HOUR]>=2))) {
  1846                              <1> 	;cmp	byte [nixonflg], 0
  1847                              <1> 	;jna	short lt1
  1848                              <1> 	;cmp	word [year], 1974
  1849                              <1> 	;jb	short lt1
  1850                              <1> 	;ja	short lt0
  1851                              <1> 	;cmp	word [yday], 5
  1852                              <1> 	;jb	short lt1
  1853                              <1> 	;ja	short lt0 
  1854                              <1> 	;cmp	word [hour], 2
  1855                              <1> 	;jb	short lt1
  1856                              <1> ; nixonflag > 0
  1857                              <1> ;lt0:
  1858                              <1> 	;mov	word [daylight], 1
  1859                              <1> 	;mov	word [daylbegin], -1
  1860                              <1> 	;mov	word [daylend], 367
  1861                              <1> ;	;jmp	short lt2
  1862                              <1> 
  1863                              <1> ; } else {
  1864                              <1> ;lt1:
  1865                              <1> ;	mov	cx, 119
  1866                              <1> ;	call	sunday ; sunday(ct, 119); /* last Sun in Apr */
  1867                              <1> ;	mov	[daylbegin], cx
  1868                              <1> ;	mov	cx, 303
  1869                              <1> ;	call	sunday ; sunday(ct, 303); /* last Sun in Oct */	
  1870                              <1> ;	mov	[daylend], cx
  1871                              <1> ;lt2:
  1872                              <1> ; if (daylight &&
  1873                              <1> ;    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
  1874                              <1> ;    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
  1875                              <1> 
  1876                              <1> ;	pop	eax
  1877                              <1> 
  1878                              <1> 	;cmp	byte [daylight], 0
  1879                              <1> 	;jna	short lt5
  1880                              <1> 	
  1881                              <1> 	;mov	cx, [yday]
  1882                              <1> 
  1883                              <1> 	;cmp	cx, [daylbegin]
  1884                              <1> 	;jb	short lt5
  1885                              <1> 	;ja	short lt3
  1886                              <1> 	;cmp	word [hour], 2
  1887                              <1> 	;jb	short lt5
  1888                              <1> 	;jmp	short lt4
  1889                              <1> ;lt3:
  1890                              <1> 	;cmp	cx, [daylend]
  1891                              <1> 	;jb	short lt4
  1892                              <1> 	;ja	short lt5
  1893                              <1> 	;cmp	word [hour], 1
  1894                              <1> 	;jnb	short lt5
  1895                              <1> ;lt4:
  1896                              <1> 	;add	eax, 1*60*60
  1897                              <1> 	;call	gmtime
  1898                              <1> 	;inc	word [isday]
  1899                              <1> ;lt5:
  1900                              <1> ;	}
  1901                              <1> ;	return(ct);
  1902                              <1> ;	}
  1903                              <1> 
  1904                              <1> 	;retn
  1905                              <1> 
  1906                              <1> 
  1907                              <1> asctime:
  1908                              <1> 	; asctime(t)
  1909                              <1> 	;int *t;
  1910                              <1> 	;{
  1911                              <1> 	;	register char *cp, *ncp;
  1912                              <1> 	;	register int *tp;
  1913                              <1> 	;
  1914                              <1> 	;	cp = cbuf;
  1915                              <1> 	;	for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;);
  1916                              <1> 	;	ncp = &"SunMonTueWedThuFriSat"[3*t[6]];
  1917                              <1> 	;	cp = cbuf;
  1918                              <1> 	;	*cp++ = *ncp++;
  1919                              <1> 	;	*cp++ = *ncp++;
  1920                              <1> 	;	*cp++ = *ncp++;
  1921                              <1> 	;	cp++;
  1922                              <1> 	;	tp = &t[4];
  1923                              <1> 	;	ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3];
  1924                              <1> 	;	*cp++ = *ncp++;
  1925                              <1> 	;	*cp++ = *ncp++;
  1926                              <1> 	;	*cp++ = *ncp++;
  1927                              <1> 	;	cp = numb(cp, *--tp);
  1928                              <1> 	;	cp = numb(cp, *--tp+100);
  1929                              <1> 	;	cp = numb(cp, *--tp+100);
  1930                              <1> 	;	cp = numb(cp, *--tp+100);
  1931                              <1> 	;	cp =+ 2;
  1932                              <1> 	;	cp = numb(cp, t[YEAR]);
  1933                              <1> 	;	return(cbuf);
  1934                              <1> 	;}
  1935                              <1> 	
  1936                              <1> 	;;mov	edi, cbuf
  1937                              <1> 	;;mov	esi, ncp0
  1938                              <1> 	;;mov	ecx, 13
  1939                              <1> 	;;movsw	
  1940                              <1> 	;
  1941 000006C9 BF[A9080000]        <1> 	mov	edi, cbuf	
  1942                              <1> 	;movzx	esi, word [wday]
  1943                              <1> 	;shl	si, 2
  1944                              <1> 	;add	esi, ncp1
  1945                              <1> 	;movsd
  1946 000006CE 0FB735[3F080000]    <1> 	movzx	esi, word [month]
  1947 000006D5 66C1E602            <1> 	shl	si, 2
  1948 000006D9 81C6[75080000]      <1> 	add	esi, ncp2 - 4
  1949 000006DF A5                  <1> 	movsd
  1950                              <1> 	;movzx eax, word [day]
  1951 000006E0 66A1[3D080000]      <1> 	mov	ax, [day]
  1952                              <1> 	;mov	cx, 10
  1953 000006E6 B10A                <1> 	mov	cl, 10
  1954 000006E8 E831010000          <1> 	call	numb
  1955 000006ED B020                <1>  	mov	al, 20h
  1956 000006EF AA                  <1> 	stosb
  1957                              <1> 	;
  1958 000006F0 66A1[41080000]      <1> 	mov	ax, [year]
  1959 000006F6 B564                <1> 	mov	ch, 100
  1960 000006F8 F6F5                <1> 	div	ch
  1961 000006FA 6650                <1> 	push	ax ;
  1962 000006FC 6698                <1> 	cbw ; century (19, 20)
  1963 000006FE E81B010000          <1> 	call	numb
  1964 00000703 6658                <1> 	pop	ax
  1965 00000705 88E0                <1> 	mov	al, ah
  1966 00000707 6698                <1> 	cbw ;	year (0 to 99)
  1967 00000709 E810010000          <1> 	call	numb
  1968 0000070E B020                <1> 	mov 	al, 20h
  1969 00000710 AA                  <1> 	stosb
  1970                              <1> 	;
  1971 00000711 0FB735[43080000]    <1>         movzx   esi, word [wday]
  1972 00000718 66C1E602            <1> 	shl	si, 2
  1973 0000071C 81C6[5D080000]      <1> 	add	esi, ncp1
  1974 00000722 A5                  <1> 	movsd
  1975                              <1> 	;
  1976 00000723 66A1[3B080000]      <1> 	mov	ax, [hour]
  1977 00000729 E8F0000000          <1> 	call	numb
  1978 0000072E B03A                <1>  	mov	al, ':'
  1979 00000730 AA                  <1> 	stosb
  1980 00000731 66A1[39080000]      <1> 	mov	ax, [minute]
  1981 00000737 E8E2000000          <1> 	call	numb
  1982 0000073C B03A                <1>  	mov	al, ':'
  1983 0000073E AA                  <1> 	stosb
  1984 0000073F 66A1[37080000]      <1> 	mov	ax, [second]
  1985 00000745 E8D4000000          <1> 	call	numb
  1986 0000074A B020                <1>  	mov	al, 20h
  1987 0000074C AA                  <1> 	stosb
  1988                              <1> 	;mov	ax, [year]
  1989                              <1> 	;mov	ch, 100
  1990                              <1> 	;div	ch
  1991                              <1> 	;push	ax ;
  1992                              <1> 	;cbw ; century (19, 20)
  1993                              <1> 	;call	numb
  1994                              <1> 	;pop	ax
  1995                              <1> 	;mov	al, ah
  1996                              <1> 	;cbw ;	year (0 to 99)
  1997                              <1> 	;call	numb
  1998                              <1> 	;mov	al, 20h
  1999                              <1> 	;stosb
  2000                              <1> 	;xor	al, al
  2001                              <1> 	;stosb
  2002                              <1> 
  2003 0000074D C3                  <1> 	retn
  2004                              <1> 
  2005                              <1> gmtime:
  2006                              <1> 	; 24/11/2013 (yday, wday)
  2007                              <1> 	; Retro UNIX 8086 v1 - UNIX.ASM (20/06/2013)
  2008                              <1> 	; Retro UNIX 8086 v1 feature/procedure only!
  2009                              <1> 	; 'convert_from_epoch' procedure prototype: 
  2010                              <1> 	; 	            UNIXCOPY.ASM, 10/03/2013
  2011                              <1> 	; 30/11/2012
  2012                              <1> 	; Derived from DALLAS Semiconductor
  2013                              <1> 	; Application Note 31 (DS1602/DS1603)
  2014                              <1> 	; 6 May 1998
  2015                              <1> 	;
  2016                              <1> 	; INPUT:
  2017                              <1> 	; DX:AX = Unix (Epoch) Time
  2018                              <1> 	;
  2019                              <1> 	; ((Modified registers: AX, DX, CX, BX))  
  2020                              <1> 	;
  2021 0000074E 31D2                <1> 	xor edx, edx
  2022 00000750 B93C000000          <1> 	mov ecx, 60
  2023 00000755 F7F1                <1> 	div ecx
  2024                              <1> 	;mov [imin], eax     	  ; whole minutes
  2025                              <1> 				  ; since 1/1/1970
  2026 00000757 668915[37080000]    <1> 	mov [second], dx  	  ; leftover seconds
  2027                              <1> 	; mov ecx, 60
  2028 0000075E 29D2                <1> 	sub edx, edx
  2029 00000760 F7F1                <1> 	div ecx
  2030                              <1> 	;mov [ihrs], eax   	  ; whole hours
  2031                              <1> 				  ; since 1/1/1970
  2032 00000762 668915[39080000]    <1> 	mov [minute], dx  	  ; leftover minutes
  2033                              <1> 	;mov ecx, 24
  2034 00000769 31D2                <1> 	xor edx, edx
  2035 0000076B B118                <1> 	mov cl, 24
  2036 0000076D F7F1                <1> 	div ecx
  2037                              <1> 	;mov [iday], ax  	  ; whole days
  2038                              <1> 				  ; since 1/1/1970
  2039 0000076F 66A3[43080000]      <1> 	mov [wday], ax 		  ; 24/11/2013	
  2040 00000775 668915[3B080000]    <1> 	mov [hour], dx   	  ; leftover hours
  2041 0000077C 05DB020000          <1> 	add eax, 365+366	  ; whole day since
  2042                              <1> 				  ; 1/1/1968 	
  2043                              <1> 	;mov [iday], ax
  2044 00000781 50                  <1> 	push eax
  2045 00000782 66B9B505            <1> 	mov cx, (4*365)+1	  ; 4 years = 1461 days
  2046 00000786 29D2                <1> 	sub edx, edx
  2047 00000788 F7F1                <1> 	div ecx
  2048 0000078A 59                  <1> 	pop ecx
  2049                              <1> 	;mov [lday], ax  	  ; count of quadyrs (4 years)
  2050 0000078B 52                  <1> 	push edx
  2051                              <1> 	;mov [qday], dx           ; days since quadyr began
  2052 0000078C 6683FA3C            <1> 	cmp dx, 31 + 29           ; if past feb 29 then
  2053 00000790 F5                  <1> 	cmc			  ; add this quadyr's leap day
  2054 00000791 83D000              <1> 	adc eax, 0		  ; to # of qadyrs (leap days)
  2055                              <1> 	;mov [lday], ax  	  ; since 1968			  
  2056                              <1> 	;mov cx, [iday]
  2057 00000794 91                  <1> 	xchg ecx, eax		  ; CX = lday, AX = iday		  
  2058 00000795 29C8                <1> 	sub eax, ecx		  ; iday - lday
  2059                              <1> 	;mov ecx, 365
  2060 00000797 66B96D01            <1> 	mov cx, 365
  2061 0000079B 31D2                <1> 	xor edx, edx		  ; DX  = 0
  2062                              <1> 	; EAX = iday-lday
  2063 0000079D F7F1                <1> 	div ecx
  2064                              <1> 	;mov [iyrs], ax		  ; whole years since 1968
  2065                              <1> 	; jday = iday - (iyrs*365) - lday
  2066                              <1> 	;mov [jday], dx  	  ; days since 1/1 of current year
  2067                              <1> 	;add eax, 1968		  ; compute year
  2068 0000079F 05B0070000          <1> 	add eax, 1968
  2069 000007A4 66A3[41080000]      <1> 	mov [year], ax
  2070 000007AA 89C3                <1> 	mov ebx, eax		
  2071                              <1> 	;mov ax, [qday]
  2072 000007AC 58                  <1> 	pop eax
  2073 000007AD 663D6D01            <1> 	cmp ax, 365		  ; if qday <= 365 and qday >= 60	
  2074 000007B1 7709                <1> 	ja short L1		  ; jday = jday +1
  2075 000007B3 6683F83C            <1> 	cmp ax, 60	          ; if past 2/29 and leap year then
  2076 000007B7 F5                  <1>         cmc			  ; add a leap day to the # of whole
  2077 000007B8 6683D200            <1> 	adc dx, 0		  ; days since 1/1 of current year
  2078                              <1> L1:			
  2079                              <1> 	;mov [jday], dx
  2080                              <1> 	;mov [yday], dx 	  ; 24/11/2013	
  2081 000007BC 66B90C00            <1> 	mov cx, 12		  ; estimate month
  2082 000007C0 6687CA              <1> 	xchg cx, dx		  ; CX = jday, DX = month 	
  2083 000007C3 66B86E01            <1> 	mov ax, 366		  ; mday, max. days since 1/1 is 365
  2084 000007C7 6683E303            <1> 	and bx, 11b		  ; year mod 4	(and bx, 3) 
  2085                              <1> L2:	; Month calculation	  ; 0 to 11  (11 to 0)	
  2086 000007CB 6639C1              <1> 	cmp cx, ax		  ; mday = # of days passed from 1/1
  2087 000007CE 731D                <1> 	jnb short L3
  2088 000007D0 664A                <1> 	dec dx			  ; month = month - 1
  2089 000007D2 66D1E2              <1> 	shl dx, 1 
  2090 000007D5 668B82[45080000]    <1> 	mov ax, [edx+DMonth] 	  ; # elapsed days at 1st of month
  2091 000007DC 66D1EA              <1> 	shr dx, 1		  ; dx = month - 1 (0 to 11)
  2092 000007DF 6683FA01            <1> 	cmp dx, 1		  ; if month > 2 and year mod 4  = 0	
  2093 000007E3 76E6                <1> 	jna short L2		  ; then mday = mday + 1
  2094 000007E5 08DB                <1> 	or bl, bl		  ; if past 2/29 and leap year then
  2095 000007E7 75E2                <1> 	jnz short L2		  ; add leap day (to mday)
  2096 000007E9 6640                <1> 	inc ax			  ; mday = mday + 1
  2097 000007EB EBDE                <1> 	jmp short L2
  2098                              <1> L3:
  2099 000007ED 6642                <1> 	inc dx 			  ; -> dx = month, 1 to 12
  2100 000007EF 668915[3F080000]    <1> 	mov [month], dx
  2101 000007F6 6629C1              <1> 	sub cx, ax		  ; day = jday - mday + 1	
  2102 000007F9 6641                <1> 	inc cx 			  
  2103 000007FB 66890D[3D080000]    <1> 	mov [day], cx
  2104                              <1> 	
  2105                              <1> 	; eax, ebx, ecx, edx are changed at return
  2106                              <1> 	; output ->
  2107                              <1> 	; [year], [month], [day], [hour], [minute], [second]
  2108                              <1> 	; [yday] -> 24/11/2013
  2109                              <1> 	; [wday] -> 24/11/2013
  2110                              <1> 	;
  2111                              <1> 	; 24/11/2013
  2112 00000802 66A1[43080000]      <1> 	mov	ax, [wday] ; [iday]
  2113 00000808 6631D2              <1> 	xor	dx, dx
  2114 0000080B 6683C004            <1> 	add	ax, 4
  2115                              <1> 	; NOTE: January 1, 1970 was THURSDAY
  2116                              <1> 	; ch = 0
  2117 0000080F B107                <1> 	mov	cl, 7
  2118 00000811 66F7F1              <1> 	div	cx
  2119 00000814 668915[43080000]    <1> 	mov	[wday], dx ; week of the day,  0 to 6 
  2120                              <1> 	; 0 = sunday ... 6 = saturday
  2121                              <1> 	;mov	word [isday], 0
  2122                              <1> 
  2123 0000081B C3                  <1> 	retn
  2124                              <1> 
  2125                              <1> 
  2126                              <1> ;sunday:
  2127                              <1> 	; sunday(at, ad)
  2128                              <1> 	; 	int *at;
  2129                              <1> 	;	 {
  2130                              <1> 	; 	register int *t, d;
  2131                              <1> 	; 	t = at;
  2132                              <1> 	; 	d = ad;
  2133                              <1> 	; 	d = ad + dysize(t[YEAR]) - 365;
  2134                              <1> 	; 	return(d - (d - t[YDAY] + t[WDAY] + 700) % 7);
  2135                              <1> 	; 	}
  2136                              <1> 
  2137                              <1> 	;mov	dx, [year]
  2138                              <1> 	;call	dysize
  2139                              <1> 	;sub	ax, 365
  2140                              <1> 	; add 	cx, ax
  2141                              <1> ;	test	word [year], 11b
  2142                              <1> ;	jnz	short sunday1
  2143                              <1> 	; CX = 119 (77h) or CX = 303 (12Fh)
  2144                              <1> 	;inc	cx
  2145                              <1> ;	inc	cl
  2146                              <1> ;sunday1:
  2147                              <1> ;	mov	ax, cx
  2148                              <1> ;	add	ax, [wday]
  2149                              <1> 	;adc	ax, 700
  2150                              <1> ;	add	ax, 700
  2151                              <1> ;	sub	ax, [yday]
  2152                              <1> 	;xor	dx, dx
  2153                              <1> ;	mov	bx, 7
  2154                              <1> 	;div	bx
  2155                              <1> ;	div	bl
  2156                              <1> ;	sub	cx, bx
  2157                              <1> ;	retn
  2158                              <1> 
  2159                              <1> ;dysize:
  2160                              <1> ; dysize(y)
  2161                              <1> ;	{
  2162                              <1> ;	if((y%4) == 0)
  2163                              <1> ;		return(366);
  2164                              <1> ;	return(365);
  2165                              <1> ;	}
  2166                              <1> 
  2167                              <1> ;	mov 	ax, 365	
  2168                              <1> ;	test 	dx, 11b
  2169                              <1> ;	jnz 	short dysize1
  2170                              <1> ;	;inc 	ax
  2171 0000081C FEC0                <1> 	inc 	al			
  2172                              <1> ;dysize1:	
  2173                              <1> ;	retn 
  2174                              <1> 		
  2175                              <1> 
  2176                              <1> numb:   ; AX = 0 to 99
  2177                              <1> 	;
  2178                              <1> 	; numb(acp, n)
  2179                              <1> 	; {
  2180                              <1> 	;	register char *cp;
  2181                              <1> 	;
  2182                              <1> 	;	cp = acp;
  2183                              <1> 	;	cp++;
  2184                              <1> 	;	if (n>=10)
  2185                              <1> 	;	   *cp++ = (n/10)%10 + '0';
  2186                              <1> 	;	else
  2187                              <1> 	;	   *cp++ = ' ';
  2188                              <1> 	;	*cp++ = n%10 + '0';
  2189                              <1> 	;	return(cp);
  2190                              <1> 	; }
  2191                              <1> 	;
  2192                              <1> 	;mov	cl, 10
  2193 0000081E 6683F80A            <1> 	cmp 	ax, 10
  2194 00000822 7306                <1> 	jnb	short nb1
  2195 00000824 88C4                <1> 	mov	ah, al
  2196 00000826 30C0                <1> 	xor	al, al ; 0
  2197 00000828 EB04                <1> 	jmp	short nb2
  2198                              <1> nb1:	
  2199 0000082A F6F1                <1> 	div	cl
  2200 0000082C 88E2                <1> 	mov	dl, ah
  2201                              <1> 	
  2202                              <1> nb2:	
  2203 0000082E 0430                <1> 	add	al, '0'
  2204 00000830 AA                  <1> 	stosb	; digit 1
  2205 00000831 88E0                <1> 	mov	al, ah
  2206 00000833 0430                <1> 	add	al, '0'
  2207 00000835 AA                  <1> 	stosb	; digit 2
  2208 00000836 C3                  <1> 	retn
  2209                              <1> 
  2210                              <1> 
  2211                              <1> ;;; DATA
  2212                              <1> 
  2213                              <1> ;daylight: db 1 ; int daylight 1; /* Allow daylight conversion */
  2214                              <1> ;nixonflg: db 0 ; int nixonflg 0; /* Daylight time all year around */
  2215                              <1> ;daylbegin: dw 0
  2216                              <1> ;daylend: dw 0
  2217                              <1> 
  2218                              <1> 
  2219                              <1> ct:
  2220                              <1> ; 24/11/2013 (re-order)
  2221                              <1> ;
  2222                              <1> ; Retro UNIX 8086 v1 - UNIX.ASM
  2223                              <1> ; 09/04/2013 epoch variables
  2224                              <1> ; Retro UNIX 8086 v1 Prototype: UNIXCOPY.ASM, 10/03/2013
  2225                              <1> ;
  2226                              <1> 
  2227 00000837 0000                <1> second: dw 0
  2228 00000839 0000                <1> minute: dw 0
  2229 0000083B 0000                <1> hour: dw 0
  2230 0000083D 0100                <1> day: dw 1
  2231 0000083F 0100                <1> month: dw 1
  2232 00000841 B207                <1> year: dw 1970
  2233 00000843 0000                <1> wday: dw 0 ; 24/11/2013
  2234                              <1> ;yday: dw 0 ; 24/11/2013
  2235                              <1> ;isday: dw 0 ; 24/11/2013
  2236                              <1> 
  2237                              <1> DMonth:
  2238 00000845 0000                <1> dw 0
  2239 00000847 1F00                <1> dw 31
  2240 00000849 3B00                <1> dw 59
  2241 0000084B 5A00                <1> dw 90
  2242 0000084D 7800                <1> dw 120
  2243 0000084F 9700                <1> dw 151
  2244 00000851 B500                <1> dw 181
  2245 00000853 D400                <1> dw 212
  2246 00000855 F300                <1> dw 243
  2247 00000857 1101                <1> dw 273
  2248 00000859 3001                <1> dw 304
  2249 0000085B 4E01                <1> dw 334
  2250                              <1> 
  2251                              <1> ;ncp0: db "Day Mon 00 00:00:00 1970", 0, 0
  2252 0000085D 53756E204D6F6E2054- <1> ncp1: db "Sun Mon Tue Wed Thu Fri Sat "
  2253 00000866 756520576564205468- <1>
  2254 0000086F 752046726920536174- <1>
  2255 00000878 20                  <1>
  2256 00000879 4A616E20466562204D- <1> ncp2: db "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "
  2257 00000882 617220417072204D61- <1>
  2258 0000088B 79204A756E204A756C- <1>
  2259 00000894 204175672053657020- <1>
  2260 0000089D 4F6374204E6F762044- <1>
  2261 000008A6 656320              <1>
  2262                              <1> 
  2263                              <1> cbuf: 	; char cbuf[26]
  2264 000008A9 00<rept>            <1> 	times 26 db 0
  2265                              <1> 
  2266                              <1> 
  2267                              <1> ;; ctime.c (Unix v5)
  2268                              <1> ;
  2269                              <1> ;#
  2270                              <1> ;/*
  2271                              <1> ; * This routine converts time as follows.
  2272                              <1> ; * The epoch is 0000 Jan 1 1970 GMT.
  2273                              <1> ; * The argument time is in seconds since then.
  2274                              <1> ; * The localtime(t) entry returns a pointer to an array
  2275                              <1> ; * containing
  2276                              <1> ; *  seconds (0-59)
  2277                              <1> ; *  minutes (0-59)
  2278                              <1> ; *  hours (0-23)
  2279                              <1> ; *  day of month (1-31)
  2280                              <1> ; *  month (0-11)
  2281                              <1> ; *  year-1970
  2282                              <1> ; *  weekday (0-6, Sun is 0)
  2283                              <1> ; *  day of the year
  2284                              <1> ; *  daylight savings flag
  2285                              <1> ; *
  2286                              <1> ; * The routine corrects for daylight saving
  2287                              <1> ; * time and will work in any time zone provided
  2288                              <1> ; * "timezone" is adjusted to the difference between
  2289                              <1> ; * Greenwich and local standard time (measured in seconds).
  2290                              <1> ; * In places like Michigan "daylight" must
  2291                              <1> ; * be initialized to 0 to prevent the conversion
  2292                              <1> ; * to daylight time.
  2293                              <1> ; *
  2294                              <1> ; * "nixonflg,", if set to 1, will
  2295                              <1> ; * cause daylight savings time all year around
  2296                              <1> ; * independently of "daylight".
  2297                              <1> ; *
  2298                              <1> ; * The routine does not work
  2299                              <1> ; * in Saudi Arabia which runs on Solar time.
  2300                              <1> ; *
  2301                              <1> ; * asctime(tvec))
  2302                              <1> ; * where tvec is produced by localtime
  2303                              <1> ; * returns a ptr to a character string
  2304                              <1> ; * that has the ascii time in the form
  2305                              <1> ; *	Thu Jan 01 00:00:00 1970n0\; *	01234567890123456789012345
  2306                              <1> ; *	0	  1	    2
  2307                              <1> ; *
  2308                              <1> ; * ctime(t) just calls localtime, then asctime.
  2309                              <1> ; */
  2310                              <1> ;char	cbuf[26];
  2311                              <1> ;int	dmsize[12]
  2312                              <1> ;{
  2313                              <1> ;	31,
  2314                              <1> ;	28,
  2315                              <1> ;	31,
  2316                              <1> ;	30,
  2317                              <1> ;	31,
  2318                              <1> ;	30,
  2319                              <1> ;	31,
  2320                              <1> ;	31,
  2321                              <1> ;	30,
  2322                              <1> ;	31,
  2323                              <1> ;	30,
  2324                              <1> ;	31
  2325                              <1> ;};
  2326                              <1> ;
  2327                              <1> ;int timezone	5*60*60;
  2328                              <1> ;int tzname[]
  2329                              <1> ;{
  2330                              <1> ;	"EST",
  2331                              <1> ;	"EDT",
  2332                              <1> ;};
  2333                              <1> ;int	daylight 1;	/* Allow daylight conversion */
  2334                              <1> ;int	nixonflg 0;	/* Daylight time all year around */
  2335                              <1> ;
  2336                              <1> ;#define SEC	0
  2337                              <1> ;#define MIN	1
  2338                              <1> ;#define HOUR	2
  2339                              <1> ;#define MDAY	3 
  2340                              <1> ;#define MON	4
  2341                              <1> ;#define YEAR	5
  2342                              <1> ;#define WDAY	6
  2343                              <1> ;#define YDAY	7
  2344                              <1> ;#define ISDAY	8
  2345                              <1> ;
  2346                              <1> ;ctime(at)
  2347                              <1> ;int *at;
  2348                              <1> ;{
  2349                              <1> ;	return(asctime(localtime(at)));
  2350                              <1> ;}
  2351                              <1> ;
  2352                              <1> ;localtime(tim)
  2353                              <1> ;int tim[];
  2354                              <1> ;{
  2355                              <1> ;	register int *t, *ct, dayno;
  2356                              <1> ;	int daylbegin, daylend;
  2357                              <1> ;	int copyt[2];
  2358                              <1> ;
  2359                              <1> ;	t = copyt;
  2360                              <1> ;	t[0] = tim[0];
  2361                              <1> ;	t[1] = tim[1];
  2362                              <1> ;	dpadd(t, -timezone);
  2363                              <1> ;	ct = gmtime(t);
  2364                              <1> ;	dayno = ct[YDAY];
  2365                              <1> ;	if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
  2366                              <1> ;	    dayno==5 && ct[HOUR]>=2))) {
  2367                              <1> ;		daylight =| 1;
  2368                              <1> ;		daylbegin = -1;
  2369                              <1> ;		daylend = 367;
  2370                              <1> ;	} else {
  2371                              <1> ;		daylbegin = sunday(ct, 119);	/* last Sun in Apr */
  2372                              <1> ;		daylend = sunday(ct, 303);	/* last Sun in Oct */
  2373                              <1> ;	}
  2374                              <1> ;	if (daylight &&
  2375                              <1> ;	    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
  2376                              <1> ;	    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
  2377                              <1> ;		dpadd(t, 1*60*60);
  2378                              <1> ;		ct = gmtime(t);
  2379                              <1> ;		ct[ISDAY]++;
  2380                              <1> ;	}
  2381                              <1> ;	return(ct);
  2382                              <1> ;}
  2383                              <1> ;
  2384                              <1> ;sunday(at, ad)
  2385                              <1> ;int *at;
  2386                              <1> ;{
  2387                              <1> ;	register int *t, d;
  2388                              <1> ;
  2389                              <1> ;	t = at;
  2390                              <1> ;	d = ad;
  2391                              <1> ;	d = ad + dysize(t[YEAR]) - 365;
  2392                              <1> ;	return(d - (d - t[YDAY] + t[WDAY] + 700) % 7);
  2393                              <1> ;}
  2394                              <1> ;
  2395                              <1> ;gmtime(tim)
  2396                              <1> ;int tim[];
  2397                              <1> ;{
  2398                              <1> ;	register int d0, d1;
  2399                              <1> ;	register *tp;
  2400                              <1> ;	static xtime[9];
  2401                              <1> ;	extern int ldivr;
  2402                              <1> ;
  2403                              <1> ;	/*
  2404                              <1> ;	 * break initial number into
  2405                              <1> ;	 * multiples of 8 hours.
  2406                              <1> ;	 * (28800 = 60*60*8)
  2407                              <1> ;	 */
  2408                              <1> ;
  2409                              <1> ;	d0 = ldiv(tim[0], tim[1], 28800);
  2410                              <1> ;	d1 = ldivr;
  2411                              <1> ;	tp = &xtime[0];
  2412                              <1> ;
  2413                              <1> ;	/*
  2414                              <1> ;	 * generate hours:minutes:seconds
  2415                              <1> ;	 */
  2416                              <1> ;
  2417                              <1> ;	*tp++ = d1%60;
  2418                              <1> ;	d1 =/ 60;
  2419                              <1> ;	*tp++ = d1%60;
  2420                              <1> ;	d1 =/ 60;
  2421                              <1> ;	d1 =+ (d0%3)*8;
  2422                              <1> ;	d0 =/ 3;
  2423                              <1> ;	*tp++ = d1;
  2424                              <1> ;
  2425                              <1> ;	/*
  2426                              <1> ;	 * d0 is the day number.
  2427                              <1> ;	 * generate day of the week.
  2428                              <1> ;	 */
  2429                              <1> ;
  2430                              <1> ;	xtime[WDAY] = (d0+4)%7;
  2431                              <1> ;
  2432                              <1> ;	/*
  2433                              <1> ;	 * year number
  2434                              <1> ;	 */
  2435                              <1> ;	for(d1=70; d0 >= dysize(d1); d1++)
  2436                              <1> ;		d0 =- dysize(d1);
  2437                              <1> ;	xtime[YEAR] = d1;
  2438                              <1> ;	xtime[YDAY] = d0;
  2439                              <1> ;
  2440                              <1> ;	/*
  2441                              <1> ;	 * generate month
  2442                              <1> ;	 */
  2443                              <1> ;
  2444                              <1> ;	if (dysize(d1)==366)
  2445                              <1> ;		dmsize[1] = 29;
  2446                              <1> ;	for(d1=0; d0 >= dmsize[d1]; d1++)
  2447                              <1> ;		d0 =- dmsize[d1];
  2448                              <1> ;	dmsize[1] = 28;
  2449                              <1> ;	*tp++ = d0+1;
  2450                              <1> ;	*tp++ = d1;
  2451                              <1> ;	xtime[ISDAY] = 0;
  2452                              <1> ;	return(xtime);
  2453                              <1> ;}
  2454                              <1> ;
  2455                              <1> ;asctime(t)
  2456                              <1> ;int *t;
  2457                              <1> ;{
  2458                              <1> ;	register char *cp, *ncp;
  2459                              <1> ;	register int *tp;
  2460                              <1> ;
  2461                              <1> ;	cp = cbuf;
  2462                              <1> ;	for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;);
  2463                              <1> ;	ncp = &"SunMonTueWedThuFriSat"[3*t[6]];
  2464                              <1> ;	cp = cbuf;
  2465                              <1> ;	*cp++ = *ncp++;
  2466                              <1> ;	*cp++ = *ncp++;
  2467                              <1> ;	*cp++ = *ncp++;
  2468                              <1> ;	cp++;
  2469                              <1> ;	tp = &t[4];
  2470                              <1> ;	ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3];
  2471                              <1> ;	*cp++ = *ncp++;
  2472                              <1> ;	*cp++ = *ncp++;
  2473                              <1> ;	*cp++ = *ncp++;
  2474                              <1> ;	cp = numb(cp, *--tp);
  2475                              <1> ;	cp = numb(cp, *--tp+100);
  2476                              <1> ;	cp = numb(cp, *--tp+100);
  2477                              <1> ;	cp = numb(cp, *--tp+100);
  2478                              <1> ;	cp =+ 2;
  2479                              <1> ;	cp = numb(cp, t[YEAR]);
  2480                              <1> ;	return(cbuf);
  2481                              <1> ;}
  2482                              <1> ;
  2483                              <1> ;dysize(y)
  2484                              <1> ;{
  2485                              <1> ;	if((y%4) == 0)
  2486                              <1> ;		return(366);
  2487                              <1> ;	return(365);
  2488                              <1> ;}
  2489                              <1> ;
  2490                              <1> ;
  2491                              <1> ;numb:
  2492                              <1> ;	
  2493                              <1> ;
  2494                              <1> ;numb(acp, n)
  2495                              <1> ;{
  2496                              <1> ;	register char *cp;
  2497                              <1> ;	cp = acp;
  2498                              <1> ;	cp++;
  2499                              <1> ;	if (n>=10)
  2500                              <1> ;		*cp++ = (n/10)%10 + '0';
  2501                              <1> ;	else
  2502                              <1> ;		*cp++ = ' ';
  2503                              <1> ;	*cp++ = n%10 + '0';
  2504                              <1> ;	return(cp);
  2505                              <1> ;}
  2506                              <1> ;
  2507                                  
  2508 000008C3 A101                    dw 417
  2509                                  
  2510 000008C5 [70150000]              brk:	dd _end + 512 ; (gstat:)
  2511                                  
  2512                                  ; directory name pointer
  2513 000008C9 00000000                dnp:	dd 0 ; (do:)
  2514                                  
  2515 000008CD [D5080000]              dotp:	dd dot
  2516                                  	;dotp:	dot
  2517 000008D1 [680D0000]              euids:	dd uidbuf
  2518                                  	; euids: uidbuf
  2519 000008D5 2E00                    dot:	db '.', 0		
  2520                                  	;dot:  <.\0>
  2521 000008D7 0D0A00                  nl:	db 0Dh, 0Ah, 0
  2522                                  	; nl:  <\n\0>
  2523 000008DA 746F74616C2000          totmes: db 'total ', 0
  2524                                  	; totmes: <total \0>
  2525 000008E1 202020                  space3: db 20h, 20h, 20h
  2526                                  	; space3: <  >
  2527 000008E4 2000                    space:	db 20h, 0
  2528                                  	; space: < \0>
  2529 000008E6 2F6574632F70617373-     passwd: db '/etc/passwd', 0
  2530 000008EF 776400             
  2531                                  	; passwd: </etc/passwd\0>
  2532 000008F2 3A0D0A00                colon:	db ':', 0Dh, 0Ah, 0
  2533                                  	; colon: <:\n\0>
  2534                                  
  2535 000008F6 00000000                eol:	dd 0 ; (pass3:)
  2536                                  
  2537 000008FA 90<rept>                align 4
  2538                                  
  2539                                  bss_start:
  2540                                  
  2541                                  ABSOLUTE bss_start
  2542                                  ;EVEN
  2543                                  ;bss:
  2544 000008FC <res 00000002>          	count:	  resw 1
  2545 000008FE <res 00000002>          	ocount:   resw 1
  2546 00000900 <res 00000002>          	longf:	  resw 1
  2547 00000902 <res 00000002>          	allflg:   resw 1
  2548 00000904 <res 00000002>          	dirflg:	  resw 1
  2549 00000906 <res 00000002>          	isadir:   resw 1 
  2550 00000908 <res 00000004>          	tblocks:  resd 1
  2551 0000090C <res 00000004>          	sortoff:  resd 1
  2552 00000910 <res 00000020>          	filnam:   resb 32
  2553 00000930 <res 00000022>          	statb:	  resb 34
  2554 00000952 <res 00000208>          	dbuf:	  resb 520 
  2555                                  	; 2 byte file descriptor, 2 byte buffer data size,
  2556                                  	; 4 byte buffer offset, 512 byte buffer data
  2557 00000B5A <res 00000208>          	obuf:	  resb 520
  2558 00000D62 <res 00000006>          	numbuf:   resb 6
  2559 00000D68 <res 00000400>          	uidbuf:   resb 1024
  2560                                  	euidbuf:  
  2561 00001168 <res 00000208>          	iobuf:	  resb 520
  2562                                  
  2563                                  alignb 4
  2564                                  	_end:
  2565                                  
  2566                                  	; .even
  2567                                  
  2568                                  	;.bss
  2569                                  
  2570                                  	;count:	  .=.+2
  2571                                  	;ocount:  .=.+2
  2572                                  	;longf:	  .=.+2
  2573                                  	;sortoff: .=.+2
  2574                                  	;allflg:  .=.+2
  2575                                  	;dirflg:  .=.+2
  2576                                  	;isadir:  .=.+2 
  2577                                  	;filnam:  .=.+32.
  2578                                  	;statb:	  .=.+34.
  2579                                  	;dbuf:	  .=.+518.
  2580                                  	;obuf:	  .=.+518.
  2581                                  	;numbuf:  .=.+6
  2582                                  	;tblocks: .=.+2
  2583                                  	;uidbuf:  .=.+1024.
  2584                                  	;euidbuf:
  2585                                  	;iobuf:	  .=.+518.
