     1                                  ; ****************************************************************************
     2                                  ; df1.s (df386.s) - print free blocks - by Erdogan Tan - 30/06/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1 (& v1.1) - file system (disk free blocks info) utility 
     5                                  ;
     6                                  ; [ Last Modification: 30/06/2022 ]
     7                                  
     8                                  ; Derived from unix v2 '/bin/df' (PDP-11 assembly) source code 
     9                                  ;
    10                                  ; ****************************************************************************
    11                                  ; [ svntree-20081216.tar.gz - bin/df (archive date: 21-11-1972) ]
    12                                  
    13                                  ; Assembler: NASM v2.15
    14                                  ; ((nasm df1.s -l df1.txt -o df1 -Z error.txt))
    15                                  
    16                                  ; UNIX v1 system calls
    17                                  _rele 	equ 0
    18                                  _exit 	equ 1
    19                                  _fork 	equ 2
    20                                  _read 	equ 3
    21                                  _write	equ 4
    22                                  _open	equ 5
    23                                  _close 	equ 6
    24                                  _wait 	equ 7
    25                                  _creat 	equ 8
    26                                  _link 	equ 9
    27                                  _unlink	equ 10
    28                                  _exec	equ 11
    29                                  _chdir	equ 12
    30                                  _time 	equ 13
    31                                  _mkdir 	equ 14
    32                                  _chmod	equ 15
    33                                  _chown	equ 16
    34                                  _break	equ 17
    35                                  _stat	equ 18
    36                                  _seek	equ 19
    37                                  _tell 	equ 20
    38                                  _mount	equ 21
    39                                  _umount	equ 22
    40                                  _setuid	equ 23
    41                                  _getuid	equ 24
    42                                  _stime	equ 25
    43                                  _quit	equ 26	
    44                                  _intr	equ 27
    45                                  _fstat	equ 28
    46                                  _emt 	equ 29
    47                                  _mdate 	equ 30
    48                                  _stty 	equ 31
    49                                  _gtty	equ 32
    50                                  _ilgins	equ 33
    51                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    52                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    53                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    54                                  ; 12/01/2022 - Retro UNIX 386 v1.2
    55                                  ; Retro UNIX 386 v2 system calls
    56                                  _setgid	equ 37
    57                                  _getgid	equ 38
    58                                  _sysver	equ 39 ; (get) Retro Unix 386 version
    59                                  
    60                                  ;;;
    61                                  ESCKey equ 1Bh
    62                                  EnterKey equ 0Dh
    63                                  
    64                                  %macro sys 1-4
    65                                      ; 03/09/2015	
    66                                      ; 13/04/2015
    67                                      ; Retro UNIX 386 v1 system call.		
    68                                      %if %0 >= 2   
    69                                  	mov ebx, %2
    70                                  	%if %0 >= 3    
    71                                  	    mov ecx, %3
    72                                  	    %if %0 = 4
    73                                  	       mov edx, %4   
    74                                  	    %endif
    75                                  	%endif
    76                                      %endif
    77                                      mov eax, %1
    78                                      int 30h	   
    79                                  %endmacro
    80                                  
    81                                  ; Retro UNIX 386 v1 system call format:
    82                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    83                                  
    84                                  ;-----------------------------------------------------------------
    85                                  ;  code
    86                                  ;-----------------------------------------------------------------
    87                                  
    88                                  [BITS 32] ; 32-bit intructions (for 80386 protected mode)
    89                                  
    90                                  [ORG 0] 
    91                                  
    92                                  START_CODE:
    93                                  	; 30/06/2022
    94 00000000 59                      	pop	ecx ; ecx = number of arguments
    95                                  	;
    96 00000001 58                      	pop	eax ; eax = argument 0 = executable file name
    97                                  	;
    98                                  	;dec	ecx
    99 00000002 FEC9                    	dec	cl
   100 00000004 7E4C                    	jng	short df_0
   101                                  
   102 00000006 5E                      	pop	esi
   103                                  
   104 00000007 66AD                    	lodsw	
   105                                  
   106 00000009 663D6664                	cmp	ax, 'fd'
   107 0000000D 7507                    	jne	short df_2
   108 0000000F 803E00                  	cmp	byte [esi], 0
   109 00000012 7654                    	jna	short df_1
   110 00000014 66AD                    	lodsw
   111                                  df_2:
   112 00000016 3C30                    	cmp	al, '0'
   113 00000018 724E                    	jb	short df_1
   114 0000001A 3C31                    	cmp	al, '1'
   115 0000001C 774A                    	ja	short df_1
   116 0000001E 08E4                    	or	ah, ah
   117 00000020 7546                    	jnz	short df_1
   118 00000022 A2[D0020000]            	mov	[fdname+7], al
   119                                  
   120                                  	sys	_open, fdname, 0 ; open /dev/fd? for read
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000027 BB[C9020000]        <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 0000002C B900000000          <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000031 B805000000          <1>  mov eax, %1
    78 00000036 CD30                <1>  int 30h
   121 00000038 734D                    	jnc	short df_3
   122                                  
   123                                  df_err:
   124                                  	sys	_write, 1, error_msg, size_emsg
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 0000003A BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 0000003F B9[36030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000044 BA0B000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000049 B804000000          <1>  mov eax, %1
    78 0000004E CD30                <1>  int 30h
   125 00000050 EB2C                    	jmp	short hang ; terminate
   126                                  	
   127                                  df_0:
   128                                  	; print usage message on stdout
   129                                  	;sys	_write, 1, program_msg, size_pmsg
   130                                  	sys	_msg, program_msg, size_pmsg, 0Fh 
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000052 BB[4D020000]        <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000057 B93C000000          <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 0000005C BA0F000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000061 B823000000          <1>  mov eax, %1
    78 00000066 CD30                <1>  int 30h
   131                                  df_1:
   132                                  	sys	_write, 1, usage_msg, size_umsg
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000068 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 0000006D B9[8A020000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000072 BA3E000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000077 B804000000          <1>  mov eax, %1
    78 0000007C CD30                <1>  int 30h
   133                                  
   134                                  hang:
   135                                  	sys	_exit
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69                              <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71                              <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 0000007E B801000000          <1>  mov eax, %1
    78 00000083 CD30                <1>  int 30h
   136 00000085 EBF7                    	jmp	short hang
   137                                  
   138                                  df_3:
   139 00000087 A3[54030000]            	mov	[fdfnum], eax
   140                                  
   141                                  	sys	_read, eax, bsbuffer, 512
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 0000008C 89C3                <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 0000008E B9[58030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000093 BA00020000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000098 B803000000          <1>  mov eax, %1
    78 0000009D CD30                <1>  int 30h
   142 0000009F 7220                    	jc	short df_4
   143                                  
   144                                  	; check Retro UNIX signature on boot sector
   145 000000A1 813D[5A030000]5255-     	cmp	dword [bsFSystemID], 'RUFS'
   145 000000A9 4653               
   146 000000AB 7514                    	jne	short df_4
   147                                  	;cmp	word [bsfdsign], 'fd'	
   148                                  	;jne	short df_4
   149                                  
   150                                  	sys	_read, [fdfnum], sbbuffer
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 000000AD 8B1D[54030000]      <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 000000B3 B9[58050000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000000B8 B803000000          <1>  mov eax, %1
    78 000000BD CD30                <1>  int 30h
   151 000000BF 730C                    	jnc	short df_5
   152                                  
   153                                  df_4:
   154                                  	;sys	_close, [fdfnum]
   155                                  	sys	_close
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69                              <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71                              <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000000C1 B806000000          <1>  mov eax, %1
    78 000000C6 CD30                <1>  int 30h
   156 000000C8 E96DFFFFFF              	jmp	df_err
   157                                  
   158                                  df_5:
   159                                  	; write volume serial number (as hex string)
   160 000000CD BE[5E030000]            	mov	esi, bsVolSerial
   161 000000D2 BF[58070000]            	mov	edi, volserialstr
   162 000000D7 B102                    	mov	cl, 2
   163 000000D9 88CD                    	mov	ch, cl ; 2
   164                                  df_6:
   165 000000DB AC                      	lodsb
   166 000000DC 88C3                    	mov	bl, al
   167 000000DE 80E30F                  	and	bl, 0Fh
   168 000000E1 8AA3[42030000]          	mov	ah, [ebx+hexchrs]
   169 000000E7 C0E804                  	shr	al, 4
   170 000000EA 88C3                    	mov	bl, al
   171 000000EC 8A83[42030000]          	mov	al, [ebx+hexchrs]
   172 000000F2 50                      	push	eax
   173 000000F3 FEC9                    	dec	cl
   174 000000F5 75E4                    	jnz	short df_6
   175 000000F7 FECD                    	dec	ch
   176 000000F9 7404                    	jz	short df_7
   177 000000FB B102                    	mov	cl, 2
   178 000000FD EBDC                    	jmp	short df_6
   179                                  df_7:
   180 000000FF 58                      	pop	eax
   181 00000100 66AB                    	stosw
   182 00000102 58                      	pop	eax
   183 00000103 66AB                    	stosw
   184 00000105 B02D                    	mov	al, '-'
   185 00000107 AA                      	stosb
   186 00000108 58                      	pop	eax
   187 00000109 66AB                    	stosw
   188 0000010B 58                      	pop	eax
   189 0000010C 66AB                    	stosw
   190                                  	
   191 0000010E B068                    	mov	al, 'h'
   192 00000110 AA                      	stosb
   193                                  
   194 00000111 66B80D0A                	mov	ax, 0A0Dh ; CRLF
   195 00000115 66AB                    	stosw
   196                                  	
   197                                  	;xor	al, al
   198                                  	;stosb
   199                                  	
   200                                  	sys	_write, 1, nextline, 2
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000117 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 0000011C B9[C6020000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000121 BA02000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000126 B804000000          <1>  mov eax, %1
    78 0000012B CD30                <1>  int 30h
   201                                  
   202                                  	;mov	ecx, fdname	
   203                                  	;mov	dl, 8
   204                                  	;sys	_write
   205                                  
   206                                  	sys	_msg, fdname, 8, 0Fh
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 0000012D BB[C9020000]        <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000132 B908000000          <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000137 BA0F000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 0000013C B823000000          <1>  mov eax, %1
    78 00000141 CD30                <1>  int 30h
   207                                  
   208                                  	;mov	ecx, volserialhdr
   209                                  	;mov	dl, size_vsnhdr
   210                                  	;sys	_write
   211                                  
   212                                  	sys	_write, 1, volserialhdr, size_vsnhdr
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000143 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000148 B9[D2020000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 0000014D BA1B000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000152 B804000000          <1>  mov eax, %1
    78 00000157 CD30                <1>  int 30h
   213                                  	
   214 00000159 B9[58070000]            	mov	ecx, volserialstr
   215 0000015E B20C                    	mov	dl, 12 ; xxxx-xxxxh, CR, LF
   216                                  	sys	_write
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69                              <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71                              <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000160 B804000000          <1>  mov eax, %1
    78 00000165 CD30                <1>  int 30h
   217                                  
   218                                  df_8:	
   219                                  	sys	_close, [fdfnum]
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000167 8B1D[54030000]      <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71                              <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 0000016D B806000000          <1>  mov eax, %1
    78 00000172 CD30                <1>  int 30h
   220                                  	;	
   221                                  
   222 00000174 BE[5A050000]            	mov	esi, freeb
   223 00000179 668B1D[58050000]        	mov	bx, [nfree]
   224 00000180 29FF                    	sub	edi, edi
   225 00000182 31C9                    	xor	ecx, ecx
   226                                  	;xor	edx, edx
   227 00000184 28D2                    	sub	dl, dl
   228 00000186 53                      	push	ebx
   229                                  df_9:
   230 00000187 AC                      	lodsb
   231 00000188 B108                    	mov	cl, 8	
   232                                  df_10:
   233 0000018A D0E8                    	shr	al, 1
   234 0000018C 7312                    	jnc	short df_11
   235 0000018E 42                      	inc	edx
   236 0000018F 09FF                    	or	edi, edi
   237 00000191 750D                    	jnz	short df_11
   238                                  	; save first free block number
   239 00000193 89F7                    	mov	edi, esi
   240 00000195 81EF[5A050000]          	sub	edi, freeb
   241 0000019B C1E703                  	shl	edi, 3 ; * 8
   242 0000019E 29CF                    	sub	edi, ecx
   243                                  df_11:		
   244 000001A0 E2E8                    	loop	df_10
   245 000001A2 4B                      	dec	ebx
   246 000001A3 75E2                    	jnz	short df_9
   247                                  
   248 000001A5 58                      	pop	eax
   249 000001A6 57                      	push	edi ; first free block
   250 000001A7 52                      	push	edx ; free blocks
   251                                  
   252 000001A8 C1E003                  	shl	eax, 3  ; number of blocks (volume size)
   253                                  
   254 000001AB E874000000              	call	decimal_number
   255                                  	; esi = start of decimal number string
   256                                  	; edi = byte count of decimal number string
   257                                  
   258                                  	sys	_write, 1, volszhdr, size_volsz
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 000001B0 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 000001B5 B9[EE020000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 000001BA BA17000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000001BF B804000000          <1>  mov eax, %1
    78 000001C4 CD30                <1>  int 30h
   259                                  
   260                                  	;sys	_write, 1, esi, edi
   261                                  		
   262 000001C6 89F1                    	mov	ecx, esi
   263 000001C8 89FA                    	mov	edx, edi
   264                                  	sys	_write
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69                              <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71                              <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000001CA B804000000          <1>  mov eax, %1
    78 000001CF CD30                <1>  int 30h
   265                                  
   266 000001D1 58                      	pop	eax ; free blocks
   267                                  	
   268 000001D2 E84D000000              	call	decimal_number
   269                                  
   270                                  	sys	_write, 1, fblkshdr, size_fblks
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 000001D7 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 000001DC B9[06030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 000001E1 BA17000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000001E6 B804000000          <1>  mov eax, %1
    78 000001EB CD30                <1>  int 30h
   271                                  
   272                                  	;sys	_write, 1, esi, edi
   273                                  
   274 000001ED 89F1                    	mov	ecx, esi
   275 000001EF 89FA                    	mov	edx, edi
   276                                  	sys	_write
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69                              <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71                              <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000001F1 B804000000          <1>  mov eax, %1
    78 000001F6 CD30                <1>  int 30h
   277                                  
   278 000001F8 58                      	pop	eax ; first free block
   279                                  	
   280 000001F9 E826000000              	call	decimal_number
   281                                  
   282                                  	sys	_write, 1, ffblkhdr, size_ffblk
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 000001FE BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000203 B9[1E030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000208 BA17000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 0000020D B804000000          <1>  mov eax, %1
    78 00000212 CD30                <1>  int 30h
   283                                  
   284                                  	;sys	_write, 1, esi, edi
   285                                  
   286 00000214 89F1                    	mov	ecx, esi
   287 00000216 89FA                    	mov	edx, edi
   288                                  	sys	_write
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69                              <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71                              <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000218 B804000000          <1>  mov eax, %1
    78 0000021D CD30                <1>  int 30h
   289                                  
   290                                  	;;sys	_write, 1, nextline, 2
   291                                  	;mov	ecx, nextline
   292                                  	;mov	dl, 2
   293                                  	;sys	_write 	
   294                                  
   295 0000021F E95AFEFFFF              	jmp	hang  ; terminate 
   296                                  
   297                                  ; ----------------------------------------------------------------
   298                                  
   299                                  decimal_number:
   300                                  	; eax = binary number
   301                                  	
   302 00000224 29C9                    	sub	ecx, ecx
   303                                  
   304 00000226 BE[68070000]            	mov	esi, num_str
   305 0000022B 89F7                    	mov	edi, esi
   306                                  
   307 0000022D 51                      	push	ecx ; 0
   308                                  
   309 0000022E B10A                    	mov	cl, 10
   310                                  dn_1:
   311 00000230 29D2                    	sub	edx, edx
   312 00000232 F7F1                    	div	ecx
   313 00000234 80C230                  	add	dl, '0'
   314 00000237 52                      	push	edx
   315 00000238 21C0                    	and	eax, eax
   316 0000023A 75F4                    	jnz	short dn_1
   317                                  dn_2:
   318 0000023C 58                      	pop	eax
   319 0000023D 21C0                    	and	eax, eax
   320 0000023F 7403                    	jz	short dn_3
   321 00000241 AA                      	stosb
   322 00000242 EBF8                    	jmp	short dn_2
   323                                  dn_3:
   324 00000244 66B80D0A                	mov	ax, 0A0Dh  ; CRLF
   325 00000248 66AB                    	stosw
   326                                  	
   327 0000024A 29F7                    	sub	edi, esi
   328 0000024C C3                      	retn		
   329                                  
   330                                  ;-----------------------------------------------------------------
   331                                  ;  data - initialized data
   332                                  ;-----------------------------------------------------------------
   333                                  
   334                                  program_msg:
   335 0000024D 0D0A                    	db  0Dh, 0Ah
   336 0000024F 526574726F20554E49-     	db  'Retro UNIX 386 v1 DF Utility by Erdogan TAN - 30/06/2022'
   336 00000258 582033383620763120-
   336 00000261 4446205574696C6974-
   336 0000026A 79206279204572646F-
   336 00000273 67616E2054414E202D-
   336 0000027C 2033302F30362F3230-
   336 00000285 3232               
   337 00000287 0D0A00                  	db  0Dh, 0Ah, 0
   338                                  usage_msg:
   339 0000028A 0D0A                    	db  0Dh, 0Ah
   340 0000028C 55736167653A206466-     	db  'Usage: df <disk>'
   340 00000295 203C6469736B3E     
   341 0000029C 0D0A                    	db  0Dh, 0Ah
   342 0000029E 0D0A                    	db  0Dh, 0Ah
   343 000002A0 4469736B204E616D65-     	db  'Disk Names: fd0, fd1, 0 (fd0), 1 (fd1)'
   343 000002A9 733A206664302C2066-
   343 000002B2 64312C203020286664-
   343 000002BB 30292C203120286664-
   343 000002C4 3129               
   344                                  	;db  0Dh, 0Ah
   345                                  nextline:
   346 000002C6 0D0A00                  	db  0Dh, 0Ah, 0
   347                                  
   348                                  size_pmsg equ usage_msg-(program_msg+1)
   349                                  
   350                                  fdname:
   351 000002C9 2F6465762F66647800      	db "/dev/fdx", 0
   352                                  
   353                                  size_umsg equ fdname-(usage_msg+1)
   354                                  
   355                                  volserialhdr:
   356 000002D2 0D0A                    	db 0Dh, 0Ah
   357 000002D4 0D0A                    	db 0Dh, 0Ah
   358 000002D6 566F6C756D65205365-     	db "Volume Serial Number : " 
   358 000002DF 7269616C204E756D62-
   358 000002E8 6572203A20         
   359 000002ED 00                      	db 0
   360                                  
   361                                  size_vsnhdr equ volszhdr-(volserialhdr+1) 
   362                                  
   363                                  volszhdr:
   364                                  	;;db 0Dh, 0Ah
   365                                  	;db 0Dh, 0Ah
   366 000002EE 566F6C756D65205369-     	db "Volume Size          : "
   366 000002F7 7A6520202020202020-
   366 00000300 2020203A20         
   367 00000305 00                      	db 0
   368                                  
   369                                  size_volsz equ fblkshdr-(volszhdr+1) 
   370                                    
   371                                  fblkshdr:
   372                                  	;;db 0Dh, 0Ah
   373                                  	;db 0Dh, 0Ah
   374 00000306 4672656520426C6F63-     	db "Free Blocks          : "
   374 0000030F 6B7320202020202020-
   374 00000318 2020203A20         
   375 0000031D 00                      	db 0
   376                                  
   377                                  size_fblks equ ffblkhdr-(fblkshdr+1) 
   378                                    
   379                                  ffblkhdr:
   380                                  	;;db 0Dh, 0Ah
   381                                  	;db 0Dh, 0Ah
   382 0000031E 466972737420467265-     	db "First Free Block     : "
   382 00000327 6520426C6F636B2020-
   382 00000330 2020203A20         
   383 00000335 00                      	db 0
   384                                  
   385                                  size_ffblk equ error_msg-(ffblkhdr+1) 
   386                                  
   387                                  error_msg:
   388 00000336 0D0A                    	db 0Dh, 0Ah	
   389 00000338 4572726F722021          	db "Error !"
   390 0000033F 0D0A00                   	db 0Dh, 0Ah, 0  
   391                                  
   392                                  hexchrs:
   393 00000342 303132333435363738-     	db '0123456789ABCDEF', 0
   393 0000034B 3941424344454600   
   394                                  
   395                                  size_emsg equ hexchrs-(error_msg+1)
   396                                  
   397                                  ;-----------------------------------------------------------------
   398                                  ;  bss - uninitialized data
   399                                  ;-----------------------------------------------------------------	
   400                                  
   401 00000353 90                      align 4
   402                                  
   403                                  bss_start:
   404                                  
   405                                  ABSOLUTE bss_start
   406                                  
   407                                  fdfnum:
   408 00000354 ????????                	resd 1
   409                                  
   410                                  bsbuffer:
   411 00000358 <res 200h>              	resb 512
   412                                  
   413                                  bsFSystemID equ bsbuffer+2
   414                                  bsVolSerial equ bsbuffer+6
   415                                  ;bsfdsign   equ bsbuffer+10
   416                                  
   417                                  sbbuffer:
   418 00000558 <res 200h>              	resb 512
   419                                  
   420                                  nfree equ sbbuffer
   421                                  freeb equ sbbuffer+2
   422                                  
   423                                  volserialstr:
   424 00000758 <res 10h>               	resb 16  ; xxxx-xxxxh, CRLF, 0
   425                                  
   426                                  num_str:
   427 00000768 <res 10h>               	resb 16
   428                                  
   429                                  bss_end:
   430                                  
   431                                  ;-----------------------------------------------------------------
   432                                  ; 30/06/2022
   433                                  ;-----------------------------------------------------------------
   434                                  ; Original UNIX v2 - df (disk free blocks info) source code
   435                                  ;-----------------------------------------------------------------
   436                                  ; [ svntree-20081216.tar.gz - bin/df (archive date: 21-11-1972) ]
   437                                  
   438                                  ;/ df -- find free space
   439                                  ;
   440                                  ;	cmp	(sp)+,$1
   441                                  ;	bgt	1f
   442                                  ;	mov	$rf0,0f
   443                                  ;	jsr	pc,df
   444                                  ;	mov	$1,r0
   445                                  ;	sys	write; plus; 1
   446                                  ;	mov	$rk1,0f
   447                                  ;	jsr	pc,df
   448                                  ;	mov	$1,r0
   449                                  ;	sys	write; plus; 1
   450                                  ;	mov	$rk2,0f
   451                                  ;	jsr	pc,df
   452                                  ;	mov	$1,r0
   453                                  ;	sys	write; plus; 1
   454                                  ;	mov	$rk3,0f
   455                                  ;	jsr	pc,df
   456                                  ;	mov	$1,r0
   457                                  ;2:
   458                                  ;	mov	$1,r0
   459                                  ;	sys	write; nl; 1
   460                                  ;	sys	exit
   461                                  ;
   462                                  ;1:
   463                                  ;	tst	(sp)+
   464                                  ;	mov	(sp)+,0f
   465                                  ;	jsr	pc,df
   466                                  ;	br	2b
   467                                  ;
   468                                  ;df:
   469                                  ;	clr	r3
   470                                  ;	sys	36.
   471                                  ;	sys	open; 0:..; 0
   472                                  ;	bes	9f
   473                                  ;	sys	read; nfree; 1024.
   474                                  ;	mov	$freeb,r1
   475                                  ;	mov	nfree,r2
   476                                  ;	asr	r2
   477                                  ;1:
   478                                  ;	mov	$16.,r4
   479                                  ;	mov	(r1)+,r5
   480                                  ;2:
   481                                  ;	rol	r5
   482                                  ;	adc	r3
   483                                  ;	dec	r4
   484                                  ;	bne	2b
   485                                  ;	dec	r2
   486                                  ;	bgt	1b
   487                                  ;9:
   488                                  ;	clr	r2
   489                                  ;	dvd	$10.,r2
   490                                  ;	mov	r3,-(sp)
   491                                  ;	mov	r2,r3
   492                                  ;	beq	2f
   493                                  ;	jsr	pc,9b
   494                                  ;2:
   495                                  ;	movb	(sp)+,ch
   496                                  ;	add	$'0,ch
   497                                  ;	mov	$1,r0
   498                                  ;	sys	write; ch; 1
   499                                  ;	rts	pc
   500                                  ;
   501                                  ;rf0:	</dev/rf0\0>
   502                                  ;rk0:	</dev/rk0\0>
   503                                  ;rk1:	</dev/rk1\0>
   504                                  ;rk2:	</dev/rk2\0>
   505                                  ;rk3:	</dev/rk3\0>
   506                                  ;plus:	<+>
   507                                  ;nl:	<\n>
   508                                  ;	.even
   509                                  ;
   510                                  ;	.bss
   511                                  ;ch:	.=.+2
   512                                  ;nfree:	.=.+2
   513                                  ;freeb:	.=.+1022.
