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