     1                                  ; ****************************************************************************
     2                                  ; df2.s (df386.s) - print free blocks - by Erdogan Tan - 30/06/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1.2 - file system (disk free blocks info) utility 
     5                                  ;
     6                                  ; [ Last Modification: 01/07/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                                  ; 01/07/2022
    82                                  ; 10/01/2022 - Retro UNIX 386 v1.2 ('sysdefs.s')
    83                                  
    84                                  struc SB ; SuperBlock
    85                                  
    86 00000000 ????????                .Header:	resd 1
    87                                  .HiddenSects:
    88 00000004 ????????                .BootSectAddr:	resd 1	; Hidden Sectors
    89                                  .TotalSects:
    90 00000008 ????????                .VolumeSize:	resd 1	; Entire Volume/Partition Size (includes ext. volume)
    91 0000000C ????????                .Version:	resd 1	
    92 00000010 ????????                .BlockSize:	resd 1	
    93 00000014 ????????                .InodeCount:	resd 1	
    94 00000018 ????????                .FreeMapAddr:	resd 1	
    95 0000001C ????????                .FreeMapSize:	resd 1	
    96 00000020 ????????                .InodeMapAddr:	resd 1	
    97 00000024 ????????                .InodeMapSize:	resd 1	
    98 00000028 ????????                .InodeTblAddr:	resd 1	
    99 0000002C ????????                .InodeTblSize:	resd 1	
   100 00000030 ????????                .FreeInodes:	resd 1	
   101 00000034 ????????                .FirstFreeIno:	resd 1	
   102 00000038 ????????                .FreeBlocks:	resd 1	
   103 0000003C ????????                .FirstFreeBlk:	resd 1	
   104 00000040 <res 13h>               .BootSecParms:	resb 19	; v1
   105 00000053 ??????????              .BSExtension:	resb 5	; v2 HDFS
   106 00000058 ??                      .Status:	resb 1	; 12/05/2021 (system modification status) (*)
   107 00000059 ??                      .Pdrv:		resb 1  ; Physical disk number (index) ; 12/05/2021 (*) 
   108 0000005A ????                    .Uno:		resw 1	; user/process number ; 12/05/2021 (*)
   109 0000005C ????????                .ModifTime:	resd 1	; (last) modification time (*)
   110 00000060 ????????                .ExtdVolTbl:	resd 1	; Extended Volume Start/Table Address
   111 00000064 ????????                .ExtdVolSize:	resd 1	; Extended Volume (swap section etc.) Size	
   112 00000068 ??                      .LBA_rw:	resb 1
   113 00000069 ??                      .ClusterSize:	resb 1
   114 0000006A ??                      .ReadOnly:	resb 1	; (SB will not be written to disk if bit 0 is 1)
   115 0000006B ??                      .Mounted:	resb 1
   116 0000006C ????????                .MountInode:	resd 1  ; double word
   117 00000070 ??                      .DevMajor:	resb 1
   118 00000071 ??                      .DevMinor:	resb 1
   119 00000072 ??                      .LongName:	resb 1
   120 00000073 ??                      .Direntry32:	resb 1
   121                                  ; 18/07/2021
   122 00000074 ????????                .FileBuffer:	resd 1
   123 00000078 ????????                .ItabBuffer:	resd 1
   124 0000007C ????????                .ImapBuffer:	resd 1
   125 00000080 ????????                .FmapBuffer:	resd 1
   126                                  ; 15/07/2021
   127 00000084 ????????                .LastInode:	resd 1
   128                                  ; 02/05/2021
   129 00000088 ????????                .FmapIndex:	resd 1
   130 0000008C ????????                .ImapIndex:	resd 1
   131 00000090 ????????                .ItableIndex:	resd 1
   132 00000094 <res 168h>              .Reserved:	resb 508-148 ; 18/07/2021
   133 000001FC ????????                .Footer:	resd 1
   134                                  
   135                                  endstruc
   136                                  
   137                                  ; Retro UNIX 386 v1 system call format:
   138                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   139                                  
   140                                  ;-----------------------------------------------------------------
   141                                  ;  code
   142                                  ;-----------------------------------------------------------------
   143                                  
   144                                  [BITS 32] ; 32-bit intructions (for 80386 protected mode)
   145                                  
   146                                  [ORG 0] 
   147                                  
   148                                  START_CODE:
   149                                  	; 01/07/2022
   150                                  	; 30/06/2022
   151 00000000 59                      	pop	ecx ; ecx = number of arguments
   152                                  	;
   153 00000001 58                      	pop	eax ; eax = argument 0 = executable file name
   154                                  	;
   155                                  	;dec	ecx
   156 00000002 FEC9                    	dec	cl
   157 00000004 7E77                    	jng	short df_4
   158                                  
   159 00000006 5E                      	pop	esi
   160                                  
   161 00000007 66AD                    	lodsw	
   162                                  
   163                                  	; 01/07/2022
   164 00000009 88C1                    	mov	cl, al
   165                                  	;cmp	ax, 'fd'
   166 0000000B 80FC64                  	cmp	ah, 'd'
   167 0000000E 7514                    	jne	short df_1
   168 00000010 3C66                    	cmp	al, 'f'
   169 00000012 7404                    	je	short df_0
   170 00000014 3C68                    	cmp	al, 'h'
   171 00000016 750C                    	jne	short df_1	
   172                                  df_0:
   173 00000018 803E00                  	cmp	byte [esi], 0
   174 0000001B 7676                    	jna	short df_5
   175 0000001D A2[98030000]            	mov	[fdname+5], al
   176 00000022 66AD                    	lodsw
   177                                  df_1:
   178 00000024 3C30                    	cmp	al, '0'
   179 00000026 726B                    	jb	short df_5
   180 00000028 3C31                    	cmp	al, '1'
   181 0000002A 7609                    	jna	short df_2
   182 0000002C 80F968                  	cmp	cl, 'h'  ; /dev/hd?
   183 0000002F 7538                    	jne	short df_3
   184 00000031 3C33                    	cmp	al, '3'
   185 00000033 775E                    	ja	short df_5
   186                                  df_2:
   187 00000035 08E4                    	or	ah, ah
   188 00000037 755A                    	jnz	short df_5
   189 00000039 A2[9A030000]            	mov	[fdname+7], al
   190                                  
   191                                  	sys	_open, fdname, 0 ; open /dev/fd? for read
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 0000003E BB[93030000]        <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000043 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 00000048 B805000000          <1>  mov eax, %1
    78 0000004D CD30                <1>  int 30h
   192 0000004F 7361                    	jnc	short df_6
   193                                  df_err:
   194                                  	sys	_write, 1, error_msg, size_emsg
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000051 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000056 B9[00040000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 0000005B BA0B000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000060 B804000000          <1>  mov eax, %1
    78 00000065 CD30                <1>  int 30h
   195 00000067 EB40                    	jmp	short hang ; terminate
   196                                  df_3:
   197 00000069 80F966                  	cmp	cl, 'f'
   198 0000006C 7425                    	je	short df_5
   199 0000006E 3C35                    	cmp	al, '5'
   200 00000070 7721                    	ja	short df_5
   201 00000072 2C02                    	sub	al, 2
   202 00000074 C605[98030000]68        	mov	byte [fdname+5], 'h' ; /dev/hd?
   203 0000007B EBB8                    	jmp	short df_2
   204                                  df_4:
   205                                  	; print usage message on stdout
   206                                  	;sys	_write, 1, program_msg, size_pmsg
   207                                  	sys	_msg, program_msg, size_pmsg, 0Fh 
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 0000007D BB[CD020000]        <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000082 B936000000          <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000087 BA0F000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 0000008C B823000000          <1>  mov eax, %1
    78 00000091 CD30                <1>  int 30h
   208                                  df_5:
   209                                  	sys	_write, 1, usage_msg, size_umsg
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000093 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000098 B9[04030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 0000009D BA8E000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000000A2 B804000000          <1>  mov eax, %1
    78 000000A7 CD30                <1>  int 30h
   210                                  hang:
   211                                  	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 000000A9 B801000000          <1>  mov eax, %1
    78 000000AE CD30                <1>  int 30h
   212 000000B0 EBF7                    	jmp	short hang
   213                                  
   214                                  df_6:
   215 000000B2 A3[20040000]            	mov	[fdfnum], eax
   216                                  
   217                                  	; 01/07/2022
   218 000000B7 803D[98030000]68        	cmp	byte byte [fdname+5], 'h'
   219 000000BE 7572                    	jne	short df_10
   220                                  
   221                                  	; hard disk.. Read masterboot sector
   222                                  	sys	_read, eax, bsbuffer, 512
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 000000C0 89C3                <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 000000C2 B9[24040000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 000000C7 BA00020000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000000CC B803000000          <1>  mov eax, %1
    78 000000D1 CD30                <1>  int 30h
   223 000000D3 724B                    	jc	short df_9
   224                                  
   225 000000D5 66813D[22060000]55-     	cmp	word [bsbuffer+510], 0AA55h  ; Valid MBR ?
   225 000000DD AA                 
   226 000000DE 7540                    	jne	short df_9 ; no
   227                                  
   228                                  	; check partition table for Retro UNIX v2 partition
   229 000000E0 B104                    	mov	cl, 4
   230 000000E2 BB[E6050000]            	mov	ebx, bsbuffer+1BEh+4 ; FS ID
   231                                  df_7:
   232 000000E7 803B71                  	cmp 	byte [ebx], 71h ; Retro UNIX v2 partition ID		
   233 000000EA 7409                    	je	short df_8
   234 000000EC FEC9                    	dec	cl
   235 000000EE 7430                    	jz	short df_9 ; retro unix v2 partition not found
   236 000000F0 83C310                  	add	ebx, 16
   237 000000F3 EBF2                    	jmp	short df_7 ; check next partition entry
   238                                  df_8:	
   239 000000F5 8B4304                  	mov	eax, [ebx+4] ; start sector address
   240 000000F8 8B5308                  	mov	edx, [ebx+8] ; partition size (in sectors)
   241 000000FB 01C2                    	add	edx, eax
   242 000000FD 7221                    	jc	short df_9
   243                                  	; max. (usable) size/address is 8388607 (sectors/blocks)
   244 000000FF 81FA00008000            	cmp	edx, 8388608 ; 800000h
   245 00000105 7319                    	jnb	short df_9
   246                                  	; eax = /dev/hd? seek position
   247 00000107 C1E009                  	shl	eax, 9 ; * 512
   248                                  	sys	_seek, [fdfnum], eax, 0 
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 0000010A 8B1D[20040000]      <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000110 89C1                <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000112 BA00000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000117 B813000000          <1>  mov eax, %1
    78 0000011C CD30                <1>  int 30h
   249 0000011E 7312                    	jnc	short df_10
   250                                  df_9:
   251                                  	sys	_close, [fdfnum]
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000120 8B1D[20040000]      <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 00000126 B806000000          <1>  mov eax, %1
    78 0000012B CD30                <1>  int 30h
   252 0000012D E91FFFFFFF              	jmp	df_err
   253                                  df_10:
   254                                  	sys	_read, [fdfnum], bsbuffer, 512
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000132 8B1D[20040000]      <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000138 B9[24040000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 0000013D BA00020000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000142 B803000000          <1>  mov eax, %1
    78 00000147 CD30                <1>  int 30h
   255 00000149 72D5                    	jc	short df_9
   256                                  
   257                                  	; check Retro UNIX signature on boot sector
   258 0000014B 813D[26040000]5255-     	cmp	dword [bsFSystemID], 'RUFS'
   258 00000153 4653               
   259 00000155 75C9                    	jne	short df_9
   260                                  	;cmp	byte [bsfdsign+1], 'd'
   261                                  	;jne	short df_9
   262                                  
   263                                  	sys	_read, [fdfnum], sbbuffer
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000157 8B1D[20040000]      <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 0000015D B9[24060000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73                              <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000162 B803000000          <1>  mov eax, %1
    78 00000167 CD30                <1>  int 30h
   264 00000169 72B5                    	jc	short df_9
   265                                  
   266                                  	; Valid superblock ?
   267 0000016B 813D[24060000]7101-     	cmp	dword [sbbuffer], 00A10171h 
   267 00000173 A100               
   268                                  			; retro unix v2 sb signature
   269 00000175 75A9                    	jne	short df_9	
   270                                  	; yes
   271                                  
   272                                  	; write volume serial number (as hex string)
   273 00000177 BE[2A040000]            	mov	esi, bsVolSerial
   274 0000017C BF[24080000]            	mov	edi, volserialstr
   275 00000181 B102                    	mov	cl, 2
   276 00000183 88CD                    	mov	ch, cl ; 2
   277                                  df_11:
   278 00000185 AC                      	lodsb
   279 00000186 88C3                    	mov	bl, al
   280 00000188 80E30F                  	and	bl, 0Fh
   281 0000018B 8AA3[0C040000]          	mov	ah, [ebx+hexchrs]
   282 00000191 C0E804                  	shr	al, 4
   283 00000194 88C3                    	mov	bl, al
   284 00000196 8A83[0C040000]          	mov	al, [ebx+hexchrs]
   285 0000019C 50                      	push	eax
   286 0000019D FEC9                    	dec	cl
   287 0000019F 75E4                    	jnz	short df_11
   288 000001A1 FECD                    	dec	ch
   289 000001A3 7404                    	jz	short df_12
   290 000001A5 B102                    	mov	cl, 2
   291 000001A7 EBDC                    	jmp	short df_11
   292                                  df_12:
   293 000001A9 58                      	pop	eax
   294 000001AA 66AB                    	stosw
   295 000001AC 58                      	pop	eax
   296 000001AD 66AB                    	stosw
   297 000001AF B02D                    	mov	al, '-'
   298 000001B1 AA                      	stosb
   299 000001B2 58                      	pop	eax
   300 000001B3 66AB                    	stosw
   301 000001B5 58                      	pop	eax
   302 000001B6 66AB                    	stosw
   303                                  	
   304 000001B8 B068                    	mov	al, 'h'
   305 000001BA AA                      	stosb
   306                                  
   307 000001BB 66B80D0A                	mov	ax, 0A0Dh ; CRLF
   308 000001BF 66AB                    	stosw
   309                                  	
   310                                  	;xor	al, al
   311                                  	;stosb
   312                                  	
   313                                  	sys	_write, 1, nextline, 2
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 000001C1 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 000001C6 B9[90030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 000001CB BA02000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000001D0 B804000000          <1>  mov eax, %1
    78 000001D5 CD30                <1>  int 30h
   314                                  
   315                                  	;mov	ecx, fdname	
   316                                  	;mov	dl, 8
   317                                  	;sys	_write
   318                                  
   319                                  	sys	_msg, fdname, 8, 0Fh
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 000001D7 BB[93030000]        <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 000001DC B908000000          <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 000001E1 BA0F000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000001E6 B823000000          <1>  mov eax, %1
    78 000001EB CD30                <1>  int 30h
   320                                  
   321                                  	;mov	ecx, volserialhdr
   322                                  	;mov	dl, size_vsnhdr
   323                                  	;sys	_write
   324                                  
   325                                  	sys	_write, 1, volserialhdr, size_vsnhdr
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 000001ED BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 000001F2 B9[9C030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 000001F7 BA1B000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 000001FC B804000000          <1>  mov eax, %1
    78 00000201 CD30                <1>  int 30h
   326                                  	
   327 00000203 B9[24080000]            	mov	ecx, volserialstr
   328 00000208 B20C                    	mov	dl, 12 ; xxxx-xxxxh, CR, LF
   329                                  	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 0000020A B804000000          <1>  mov eax, %1
    78 0000020F CD30                <1>  int 30h
   330                                  
   331                                  df_13:	
   332                                  	sys	_close, [fdfnum]
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000211 8B1D[20040000]      <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 00000217 B806000000          <1>  mov eax, %1
    78 0000021C CD30                <1>  int 30h
   333                                  	;	
   334 0000021E A1[2C060000]            	mov	eax, [sbbuffer+SB.VolumeSize] ; fs size in blocks
   335                                  
   336 00000223 E87C000000              	call	decimal_number
   337                                  	; esi = start of decimal number string
   338                                  	; edi = byte count of decimal number string
   339                                  
   340                                  	sys	_write, 1, volszhdr, size_volsz
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000228 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 0000022D B9[B8030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000232 BA17000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000237 B804000000          <1>  mov eax, %1
    78 0000023C CD30                <1>  int 30h
   341                                  
   342                                  	;sys	_write, 1, esi, edi
   343                                  		
   344 0000023E 89F1                    	mov	ecx, esi
   345 00000240 89FA                    	mov	edx, edi
   346                                  	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 00000242 B804000000          <1>  mov eax, %1
    78 00000247 CD30                <1>  int 30h
   347                                  
   348 00000249 A1[5C060000]            	mov	eax, [sbbuffer+SB.FreeBlocks] ; free blocks
   349                                  	
   350 0000024E E851000000              	call	decimal_number
   351                                  
   352                                  	sys	_write, 1, fblkshdr, size_fblks
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 00000253 BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000258 B9[D0030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 0000025D BA17000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 00000262 B804000000          <1>  mov eax, %1
    78 00000267 CD30                <1>  int 30h
   353                                  
   354                                  	;sys	_write, 1, esi, edi
   355                                  
   356 00000269 89F1                    	mov	ecx, esi
   357 0000026B 89FA                    	mov	edx, edi
   358                                  	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 0000026D B804000000          <1>  mov eax, %1
    78 00000272 CD30                <1>  int 30h
   359                                  
   360 00000274 A1[60060000]            	mov	eax, [sbbuffer+SB.FirstFreeBlk] ; first free block
   361                                  	
   362 00000279 E826000000              	call	decimal_number
   363                                  
   364                                  	sys	_write, 1, ffblkhdr, size_ffblk
    65                              <1> 
    66                              <1> 
    67                              <1> 
    68                              <1>  %if %0 >= 2
    69 0000027E BB01000000          <1>  mov ebx, %2
    70                              <1>  %if %0 >= 3
    71 00000283 B9[E8030000]        <1>  mov ecx, %3
    72                              <1>  %if %0 = 4
    73 00000288 BA17000000          <1>  mov edx, %4
    74                              <1>  %endif
    75                              <1>  %endif
    76                              <1>  %endif
    77 0000028D B804000000          <1>  mov eax, %1
    78 00000292 CD30                <1>  int 30h
   365                                  
   366                                  	;sys	_write, 1, esi, edi
   367                                  
   368 00000294 89F1                    	mov	ecx, esi
   369 00000296 89FA                    	mov	edx, edi
   370                                  	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 00000298 B804000000          <1>  mov eax, %1
    78 0000029D CD30                <1>  int 30h
   371                                  
   372                                  	;;sys	_write, 1, nextline, 2
   373                                  	;mov	ecx, nextline
   374                                  	;mov	dl, 2
   375                                  	;sys	_write 	
   376                                  
   377 0000029F E905FEFFFF              	jmp	hang  ; terminate 
   378                                  
   379                                  ; ----------------------------------------------------------------
   380                                  
   381                                  decimal_number:
   382                                  	; eax = binary number
   383                                  	
   384 000002A4 29C9                    	sub	ecx, ecx
   385                                  
   386 000002A6 BE[34080000]            	mov	esi, num_str
   387 000002AB 89F7                    	mov	edi, esi
   388                                  
   389 000002AD 51                      	push	ecx ; 0
   390                                  
   391 000002AE B10A                    	mov	cl, 10
   392                                  dn_1:
   393 000002B0 29D2                    	sub	edx, edx
   394 000002B2 F7F1                    	div	ecx
   395 000002B4 80C230                  	add	dl, '0'
   396 000002B7 52                      	push	edx
   397 000002B8 21C0                    	and	eax, eax
   398 000002BA 75F4                    	jnz	short dn_1
   399                                  dn_2:
   400 000002BC 58                      	pop	eax
   401 000002BD 21C0                    	and	eax, eax
   402 000002BF 7403                    	jz	short dn_3
   403 000002C1 AA                      	stosb
   404 000002C2 EBF8                    	jmp	short dn_2
   405                                  dn_3:
   406 000002C4 66B80D0A                	mov	ax, 0A0Dh  ; CRLF
   407 000002C8 66AB                    	stosw
   408                                  	
   409 000002CA 29F7                    	sub	edi, esi
   410 000002CC C3                      	retn		
   411                                  
   412                                  ;-----------------------------------------------------------------
   413                                  ;  data - initialized data
   414                                  ;-----------------------------------------------------------------
   415                                  
   416                                  program_msg:
   417 000002CD 0D0A                    	db  0Dh, 0Ah
   418 000002CF 526574726F20554E49-     	db  'Retro UNIX 386 v1.2 DF by Erdogan TAN - 01/07/2022'
   418 000002D8 58203338362076312E-
   418 000002E1 322044462062792045-
   418 000002EA 72646F67616E205441-
   418 000002F3 4E202D2030312F3037-
   418 000002FC 2F32303232         
   419 00000301 0D0A00                  	db  0Dh, 0Ah, 0
   420                                  usage_msg:
   421 00000304 0D0A                    	db  0Dh, 0Ah
   422 00000306 55736167653A206466-     	db  'Usage: df <disk>'
   422 0000030F 203C6469736B3E     
   423 00000316 0D0A                    	db  0Dh, 0Ah
   424 00000318 0D0A                    	db  0Dh, 0Ah
   425 0000031A 4469736B204E616D65-     	db  'Disk Names: fd0, fd1, 0 (fd0), 1 (fd1)'
   425 00000323 733A206664302C2066-
   425 0000032C 64312C203020286664-
   425 00000335 30292C203120286664-
   425 0000033E 3129               
   426 00000340 0D0A                    	db  0Dh, 0Ah
   427 00000342 202020202020202020-     	db  '            hd0, hd1, hd2, hd3'
   427 0000034B 2020206864302C2068-
   427 00000354 64312C206864322C20-
   427 0000035D 686433             
   428 00000360 0D0A                    	db  0Dh, 0Ah
   429 00000362 202020202020202020-     	db  '            2 (hd0), 3 (hd1), 4 (hd2), 5 (hd3)'			
   429 0000036B 202020322028686430-
   429 00000374 292C20332028686431-
   429 0000037D 292C20342028686432-
   429 00000386 292C20352028686433-
   429 0000038F 29                 
   430                                  	;db 0Dh, 0Ah
   431                                  nextline:
   432 00000390 0D0A00                  	db  0Dh, 0Ah, 0
   433                                  
   434                                  size_pmsg equ usage_msg-(program_msg+1)
   435                                  
   436                                  fdname:
   437 00000393 2F6465762F66647800      	db "/dev/fdx", 0
   438                                  
   439                                  size_umsg equ fdname-(usage_msg+1)
   440                                  
   441                                  volserialhdr:
   442 0000039C 0D0A                    	db 0Dh, 0Ah
   443 0000039E 0D0A                    	db 0Dh, 0Ah
   444 000003A0 566F6C756D65205365-     	db "Volume Serial Number : " 
   444 000003A9 7269616C204E756D62-
   444 000003B2 6572203A20         
   445 000003B7 00                      	db 0
   446                                  
   447                                  size_vsnhdr equ volszhdr-(volserialhdr+1) 
   448                                  
   449                                  volszhdr:
   450                                  	;;db 0Dh, 0Ah
   451                                  	;db 0Dh, 0Ah
   452 000003B8 566F6C756D65205369-     	db "Volume Size          : "
   452 000003C1 7A6520202020202020-
   452 000003CA 2020203A20         
   453 000003CF 00                      	db 0
   454                                  
   455                                  size_volsz equ fblkshdr-(volszhdr+1) 
   456                                    
   457                                  fblkshdr:
   458                                  	;;db 0Dh, 0Ah
   459                                  	;db 0Dh, 0Ah
   460 000003D0 4672656520426C6F63-     	db "Free Blocks          : "
   460 000003D9 6B7320202020202020-
   460 000003E2 2020203A20         
   461 000003E7 00                      	db 0
   462                                  
   463                                  size_fblks equ ffblkhdr-(fblkshdr+1) 
   464                                    
   465                                  ffblkhdr:
   466                                  	;;db 0Dh, 0Ah
   467                                  	;db 0Dh, 0Ah
   468 000003E8 466972737420467265-     	db "First Free Block     : "
   468 000003F1 6520426C6F636B2020-
   468 000003FA 2020203A20         
   469 000003FF 00                      	db 0
   470                                  
   471                                  size_ffblk equ error_msg-(ffblkhdr+1) 
   472                                  
   473                                  error_msg:
   474 00000400 0D0A                    	db 0Dh, 0Ah	
   475 00000402 4572726F722021          	db "Error !"
   476 00000409 0D0A00                   	db 0Dh, 0Ah, 0  
   477                                  
   478                                  hexchrs:
   479 0000040C 303132333435363738-     	db '0123456789ABCDEF', 0
   479 00000415 3941424344454600   
   480                                  
   481                                  size_emsg equ hexchrs-(error_msg+1)
   482                                  
   483                                  ;-----------------------------------------------------------------
   484                                  ;  bss - uninitialized data
   485                                  ;-----------------------------------------------------------------	
   486                                  
   487 0000041D 90<rep 3h>              align 4
   488                                  
   489                                  bss_start:
   490                                  
   491                                  ABSOLUTE bss_start
   492                                  
   493                                  fdfnum:
   494 00000420 ????????                	resd 1
   495                                  
   496                                  bsbuffer:
   497 00000424 <res 200h>              	resb 512
   498                                  
   499                                  bsFSystemID equ bsbuffer+2
   500                                  bsVolSerial equ bsbuffer+6
   501                                  ;bsfdsign   equ bsbuffer+10
   502                                  
   503                                  sbbuffer:
   504 00000624 <res 200h>              	resb 512
   505                                  
   506                                  nfree equ sbbuffer
   507                                  freeb equ sbbuffer+2
   508                                  
   509                                  volserialstr:
   510 00000824 <res 10h>               	resb 16  ; xxxx-xxxxh, CRLF, 0
   511                                  
   512                                  num_str:
   513 00000834 <res 10h>               	resb 16
   514                                  
   515                                  bss_end:
   516                                  
   517                                  ;-----------------------------------------------------------------
   518                                  ; 30/06/2022
   519                                  ;-----------------------------------------------------------------
   520                                  ; Original UNIX v2 - df (disk free blocks info) source code
   521                                  ;-----------------------------------------------------------------
   522                                  ; [ svntree-20081216.tar.gz - bin/df (archive date: 21-11-1972) ]
   523                                  
   524                                  ;/ df -- find free space
   525                                  ;
   526                                  ;	cmp	(sp)+,$1
   527                                  ;	bgt	1f
   528                                  ;	mov	$rf0,0f
   529                                  ;	jsr	pc,df
   530                                  ;	mov	$1,r0
   531                                  ;	sys	write; plus; 1
   532                                  ;	mov	$rk1,0f
   533                                  ;	jsr	pc,df
   534                                  ;	mov	$1,r0
   535                                  ;	sys	write; plus; 1
   536                                  ;	mov	$rk2,0f
   537                                  ;	jsr	pc,df
   538                                  ;	mov	$1,r0
   539                                  ;	sys	write; plus; 1
   540                                  ;	mov	$rk3,0f
   541                                  ;	jsr	pc,df
   542                                  ;	mov	$1,r0
   543                                  ;2:
   544                                  ;	mov	$1,r0
   545                                  ;	sys	write; nl; 1
   546                                  ;	sys	exit
   547                                  ;
   548                                  ;1:
   549                                  ;	tst	(sp)+
   550                                  ;	mov	(sp)+,0f
   551                                  ;	jsr	pc,df
   552                                  ;	br	2b
   553                                  ;
   554                                  ;df:
   555                                  ;	clr	r3
   556                                  ;	sys	36.
   557                                  ;	sys	open; 0:..; 0
   558                                  ;	bes	9f
   559                                  ;	sys	read; nfree; 1024.
   560                                  ;	mov	$freeb,r1
   561                                  ;	mov	nfree,r2
   562                                  ;	asr	r2
   563                                  ;1:
   564                                  ;	mov	$16.,r4
   565                                  ;	mov	(r1)+,r5
   566                                  ;2:
   567                                  ;	rol	r5
   568                                  ;	adc	r3
   569                                  ;	dec	r4
   570                                  ;	bne	2b
   571                                  ;	dec	r2
   572                                  ;	bgt	1b
   573                                  ;9:
   574                                  ;	clr	r2
   575                                  ;	dvd	$10.,r2
   576                                  ;	mov	r3,-(sp)
   577                                  ;	mov	r2,r3
   578                                  ;	beq	2f
   579                                  ;	jsr	pc,9b
   580                                  ;2:
   581                                  ;	movb	(sp)+,ch
   582                                  ;	add	$'0,ch
   583                                  ;	mov	$1,r0
   584                                  ;	sys	write; ch; 1
   585                                  ;	rts	pc
   586                                  ;
   587                                  ;rf0:	</dev/rf0\0>
   588                                  ;rk0:	</dev/rk0\0>
   589                                  ;rk1:	</dev/rk1\0>
   590                                  ;rk2:	</dev/rk2\0>
   591                                  ;rk3:	</dev/rk3\0>
   592                                  ;plus:	<+>
   593                                  ;nl:	<\n>
   594                                  ;	.even
   595                                  ;
   596                                  ;	.bss
   597                                  ;ch:	.=.+2
   598                                  ;nfree:	.=.+2
   599                                  ;freeb:	.=.+1022.
