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

{%begin
  %string(8) infilename= "b.sh"

  %byteintegerarray abuf(1:512)
  %integer totalSize
  %integer i, j, k, n, blknum
  %integer address
  %integer p        { as address
  %integer kk, abufIndex, addrBlkNum
%recordformat filsys ( %short   isize,
                   %integer fsize,
                   %short   nfree,
                   %integerarray free( 0: NICFREE - 1 ),
                   %integerarray dummy(1: 512)       )
                             { can be 512-164, large enough to play safe
%record(filsys) fs

    %routine ph2(%integer i )
      phex2(i); printsymbol(' ')
    %end

    %routine ph4(%integer i )
      phex4(i); printsymbol(' ')
    %end

    %routine FillAddr( %integer blknum, abufIndex )
       integer( addr( abuf( abufIndex ) ) ) = blknum
    %end

    %routine AssignFS
    %integer i
       n = integer( addr( buffer(1) ) )
printstring("no. of free blocks:")
write(n, 6); 
newline
       p = addr( fs_free(0) ) -4 -1 
                            { -4    s.t. +i below is o.k.
                               { -1 s.t. +i below is o.k.
       byteinteger( p + i ) = buffer( i ) %for i= 4, 1, 4 + 4*(NICFREE)
    %end

    %routine getfs
    %integer i
      i = ReadDisk( SUPERB )
      p = addr( fs ) - 1
      byteinteger( p + i ) = buffer( i ) %for i= 1,1,512
      n = fs_nfree
printstring("no. of free blocks:");
write(n, 6); 
newline
    %end

%routine cleanup
%integer p

printstring(" in cleanup ");

write(totalSize,7)
 
  abuf(k)=16_00 %for k=1,1,512
  getfs
{n updated in writing init already
{  n = n - 2 - 7 {1st data block for directory '/'
                {2nd data block for directory '/dev'
                {7 blocks for init
  k = 0

  {fill in 1st 10 primary addressed blocks: }
  %for kk= 1,1,10 %cycle
{    buffer(i) =  buf(k + i) %for i=1,1,512
    buffer(i) = byteinteger( address + i ) %for i= 1, 1, 512
    n = n - 1
    blknum = fs_free( n )
    WriteDisk( blknum )
ph4(blknum)
    k = k + 512
    address = address + 512
  %repeat
newline

  n = n - 1
  addrBlkNum = fs_free(n)
                { 2ndary addr-blk -- this address is written by program 'ino' }
  abufIndex = 1

  %while k <= totalSize %cycle
    n = n - 1
    blknum = fs_free( n )

    %if n <= 0 %start
printstring("get linked list"); ph4(blknum) 
       i = ReadDisk( blknum )
       AssignFS
{{{ no need to get next fs_free; just use this blknum as in alloc()
{{{       n = n - 1
{{{       blknum = fs_free( n )
    %finish

    FillAddr( blknum, abufIndex )
    abufIndex = abufIndex + 4

{    buffer(i) =  buf(k + i) %for i=1,1,512
    buffer(i) = byteinteger( address + i ) %for i= 1, 1, 512
    WriteDisk( blknum )
ph4(blknum);
    k = k + 512
    address = address + 512
  %repeat
newline
printstring("final:");
ph4(blknum); newline

  fs_nfree = n
printstring("no. free blk in SUPERB="); ph4(n); newline
  p = addr( fs ) - 1
  buffer(i) = byteinteger( p + i ) %for i=1,1,512
  WriteDisk( SUPERB )
printstring(" end: SUPERB addrBlk ");
phex4(SUPERB);
printsymbol(' ')
  buffer(i) = abuf(i) %for i=1,1,512
  WriteDisk( addrBlkNum )
printsymbol(' ')
phex4(addrBlkNum)
newline
%end  {cleanup}


{main}
  init

phex4(SUPERB)

  totalSize = filesize( infilename )
  connect file( infilename, 0, address, totalSize)
  address = address - 1  {s.t. +1 starts from 1st byte

  cleanup

  bye
%endofprogram
