//See Install Documentation.
//Study my account examples: Cfg Strs, Update Funs

#include "BootHD"

#help_index "Install"

#define KERNEL_BIN_C    "Kernel.BIN.C"

U0 MakeAll()
{
  if (Cmp("/Compiler/Compiler","Compiler",,':'))
    throw;
  if (Cmp("/Kernel/Kernel","Kernel",,':'))
    throw;
}

public U0 BootHDIns(U8 drv_let=0)
{//MakeAll and install new boot-loader.
  CDrv *dv;
  CFAT32Boot br;
  CDirEntry de;
  I64 i;
  try {
    if (!Drv(drv_let))
      throw;
    dv=Fs->cur_dv;
    MakeAll;
    switch (Let2BlkDevType(dv->drv_let)) {
      case BDT_RAM:
      case BDT_ATA:
        Move("/Kernel/Kernel.BIN.Z","/" KERNEL_BIN_C);
        if (!FileFind("/" KERNEL_BIN_C,&de,FUF_JUST_FILES))
          "No Kernel.BIN.C\n";
        else {
          Free(de.full_name);
          "Modifying partition boot record.\n";
          BlkRead(dv,&br,dv->drv_offset,1);
          br.jump_and_nop[0]=OC_JMP_REL8;
          br.jump_and_nop[1]=offset(CFAT32Boot.code)-2;
#assert offset(CFAT32Boot.code)>=offset(CRedSeaBoot.code)
          br.jump_and_nop[2]=OC_NOP;
          *BHD_BLK_CNT(U16 *)=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS;
          *BHD_DAP_BLK(I64 *)=Clus2Blk(dv,de.clus);
          for (i=0;i<BHD_END-BHD_CODE;i++)
            br.code[i]=BHD_CODE(U8 *)[i];
#assert sizeof(CFAT32Boot.code)>=BHD_END-BHD_CODE
          for (;i<sizeof(CFAT32Boot.code);i++)
            br.code[i]=0;
          BlkWrite(dv,&br,dv->drv_offset,1);
        }
        break;
      default:
        throw;
    }
  } catch {
    PutExcept;
    Beep;
  }
}