%include "dkmain.imp-nolist"
%include "writedk.imp-nolist"

{%include "put68.imp-nolist"
{ called as: put68( byteinteger( addr(data) ), size, index )

%routine put68( %byteintegername data, %integer size, index )
    %if size = 4 %start
        buffer( index     ) = data 
        buffer( index + 1 ) = byteinteger( addr( data ) + 1 )
        buffer( index + 2 ) = byteinteger( addr( data ) + 2 )
        buffer( index + 3 ) = byteinteger( addr( data ) + 3 )
    %elseif size = 2 
        buffer( index     ) = data
        buffer( index + 1 ) = byteinteger( addr( data ) + 1 )
    %else { size = 1
        buffer( index     ) = data
    %finish
%end

{%begin
  %integer FILSYSSTART
  %integer firstBlkLink
  %integer blkNum, blkLinkNum
  %integer index, i, data, k, offset, limit
  %byteinteger answer
  %label EndOfProg

%routine EmptyBlks( %integer beginBlk, endBlk )
%integer i
    buffer(i) = 0 %for i= 1, 1, 512
printstring(" EmptyBlks "); phex(beginBlk); printsymbol(' '); phex(endBlk);
newline
  %for i= beginBlk,1,endBlk %cycle
    WriteDisk( i );
  %repeat
%end

{main}
  init

  prompt("Clean file system (y/n): ");
  readsymbol(answer);

phex(SUPERB)      
newline
  FILSYSSTART = SUPERB + 1

   EmptyBlks( FILSYSSTART, MaxBlkNum ) %if answer = 'y'

{start putting in free block addresses into block 'blknum' : }

  firstBlkLink = FILSYSSTART + NICINOD + NICFREE - 1

  blkNum = firstBlkLink ;
  %cycle
    blkLinkNum = blkNum
    buffer(i) = 0 %for i= 1, 1, 512
    index  = 4 * ( NICFREE - 1 ) + 1 + 4
                                   { + 4 for int   df_nfree
  { index into buffer() of struct(  int df_nfree; daddr_t df_free[ NICFREE ] )
 
    { fill in 0 to NICFREE-1 addresses : }
    i = 0
    %while i < NICFREE %cycle
      %if blkNum < MaxBlkNum %start
        blkNum = blkNum + 1
        data = blknum
        put68( byteinteger( addr(data) ), 4, index )
        index = index - 4
      %else
        data = 0
        put68( byteinteger( addr(data) ), 4, index )
        i = i + 1
        
        offset = index - 5  { index points to address 0
        limit = 5 + 4*i
{        limit = 5+(NICFREE)*4 - index
        buffer(k) = buffer( k + offset ) %for k= 5, 1, limit
        buffer(k) = 0 %for k= limit+1, 1, 512

        { i = no. of free blk }
        put68( byteinteger( addr(i) ), 4, 1 )  
        WriteDisk( blkLinkNum )
        phex4( blkNum )
        write(i,10)
        newline
        -> EndOfProg
      %finish
 
      i = i + 1
    %repeat
 
    { i = NICFREE }
    put68( byteinteger( addr( i) ), 4, 1 )   
    WriteDisk( blkLinkNum )
    phex4( blkLinkNum )
    printsymbol(' ')
  %repeat

EndOfProg:
  bye
%endofprogram
