#include <stdio.h>
#include <dos.h>
#include <bios.h>

typedef struct _PART_ENTRY_
{
  unsigned char flag;
  unsigned char beg_head;
  unsigned beg_sec_cyl;
  unsigned char sys;
  unsigned char end_head;
  unsigned end_sec_cyl;
  unsigned long rel_sec;
  unsigned long size;
} PART_ENTRY;

typedef struct _MBOOT_
{
  char boot_prg[0x1be];
  PART_ENTRY part_table[4];
  unsigned char signature[2];
} MBOOT;

int getmboot(MBOOT *master_boot, int drive);

int main(void)
{
  MBOOT mb;
  int i,j, k, status;

  printf("\nТаблица разделов диска"
	 "\n  (C)Фролов А., 1995\n");

  // Читаем главную загрузочную запись первого НМД
  status = getmboot(&mb, 0);
  if(status != 0)
  {
    printf("\nОшибка чтения диска, код ошибки: %d",
      status);
    return(1);
  }

  printf("\n"
"\n------------------------------------------------------------"
"\n|Флаг|Начало раздела |Конец раздела  |Код  |Размер |Отн.   |"
"\n|    |---------------|---------------|сист.|раздела|номер  |"
"\n|    |Гол.|Сект.|Цил.|Гол.|Сект.|Цил.|     |       |сектора|"
"\n|----|----|-----|----|----|-----|----|-----|-------|-------|"
"\n");

  for(k=0; k<4; k++)
  {
    printf("|%3X |%4d|%4d |%4d|%4d|%4d |%4d|%5d|%7u|",
      mb.part_table[k].flag,
      mb.part_table[k].beg_head,
      mb.part_table[k].beg_sec_cyl & 0x3f,
      (mb.part_table[k].beg_sec_cyl >> 6) & 0x3ff,
      mb.part_table[k].end_head,
      mb.part_table[k].end_sec_cyl & 0x3f,
      (mb.part_table[k].end_sec_cyl >> 6) & 0x3ff,
      mb.part_table[k].sys,
      mb.part_table[k].size);

    printf("%7u|\n", mb.part_table[k].rel_sec);
  }
  printf("---------------------------"
    "---------------------------------");
  return 0;
}

/**
* getmboot
*
* Чтение главной загрузочной записи
*
* Функция читает главную загрузочную запись
* для указанного НМД
*
* int getmboot(MBOOT *master_boot, int drive);
*
* master_boot - указатель на буфер, в который
*     будет считана главная загрузочная запись
*
* drive       - номер НМД
*               (0 - первый НМД, 1 - второй,...)
*
* Функция возвращает 0, если главная
* загрузочная запись считана успешно,
* или код ошибки, полученный от функции BIOS "Чтение
* сектора" - если чтение главной загрузочной
* записи выполнить невозможно
**/

int getmboot(MBOOT *master_boot, int drive)
{
  struct diskinfo_t di;
  int status;

  // Готовим структуру для чтения
  // главной загрузочной записи
  di.drive = drive | 0x80;
  di.head     = 0;
  di.track    = 0;
  di.sector   = 1;
  di.nsectors = 1;
  di.buffer   = (void far*)master_boot;

  // Читаем сектор, содержащий главную
  // загрузочную запись
  status = _bios_disk( _DISK_READ, &di ) >> 8;
  return(status);
}

