FreeDOS source code study - fdisk compile source code

Prepare operating system

The OS can be Windows 98 or Windows XP.

Install NASM

Download NASM from here.

Decompress the archive to C:\fdisk_build\nasm.

Make sure C:\fdisk_build\nasm\nasm.exe is there.

Install Turbo C++

Download Turbo C++ from here.

Decompress the archive to C:\fdisk_build\turbocpp_images.

The directory contains five floppy image files:

  • Disk01.img
  • Disk02.img
  • Disk03.img
  • Disk04.img
  • Disk05.img

Download Virtual Floppy Drive from here.

Decompress the archive to C:\fdisk_build\vfd.

Run C:\fdisk_build\vfd\vfdwin.exe.

In tab Driver, click Install and Start.

In tab Drive0, click Change to add drive A:.

Click Open/Create... to mount image file C:\fdisk_build\turbocpp_images\Disk01.img.

Click A:\INSTALL.EXE to start Turbo C++ installation.

During the installation, use Virtual Floppy Drive to switch the floppy image according to the prompt.

Install Turbo C++ to C:\fdisk_build\turbocpp.

Make sure C:\fdisk_build\turbocpp\bin\tcc.exe is there.

Prepare fdisk source code

Download fdisk source code from here.

Decompress the archive to C:\fdisk_build\fdisk.

Copy C:\fdisk_build\fdisk\SOURCE\BOOTEASY\BOOTEASY.ASM to C:\fdisk_build\fdisk\SOURCE\FDISK\BOOTEASY.ASM.

Copy C:\fdisk_build\fdisk\SOURCE\BOOTNORM\BOOTNORM.ASM to C:\fdisk_build\fdisk\SOURCE\FDISK\BOOTNORM.ASM.

Decompress C:\fdisk_build\fdisk\SOURCE\CATS396S.ZIP to C:\fdisk_build\fdisk\SOURCE\CATS396S.

I tried building CATS into catdb.lib using Turbo C 2.01, then link with it when building fdisk. The linking failed for unknown reason. So instead we build CATS directly with fdisk.

Copy CATGETS.C, DB.C, and GET_LINE.C from C:\fdisk_build\fdisk\SOURCE\CATS396S\CATS39\LIB to C:\fdisk_build\fdisk\SOURCE\FDISK.

Apply the following changes to C:\fdisk_build\fdisk\SOURCE\FDISK\GET_LINE.C.

Change line 44

str = malloc (sizeof (char) * str_size);


str = (char*) malloc (sizeof (char) * str_size);

Change line 64

tmp_str = realloc (str, sizeof (char) * str_size);


tmp_str = (char*) realloc (str, sizeof (char) * str_size);

Apply the following changes to C:\fdisk_build\fdisk\SOURCE\FDISK\MAKEFILE.


OBJ = main.obj bootnormal.obj booteasy.obj cmd.obj fdiskio.obj \
      helpscr.obj kbdinput.obj pdiskio.obj pcompute.obj \
      userint1.obj userint2.obj


OBJ1 = main.obj bootnormal.obj booteasy.obj cmd.obj fdiskio.obj
OBJ2 = helpscr.obj kbdinput.obj pdiskio.obj pcompute.obj
OBJ3 = userint1.obj userint2.obj db.obj catgets.obj get_line.obj
OBJ = $(OBJ1) $(OBJ2) $(OBJ3)


ui2.obj: userint2.c
 $(CC) $(CFLAGS) -c


ui2.obj: userint2.c
 $(CC) $(CFLAGS) -c userint2.c

db.obj: db.c
 $(CC) $(CFLAGS) -c db.c 

catgets.obj: catgets.c 
 $(CC) $(CFLAGS) -c catgets.c

get_line.obj: get_line.c
 $(CC) $(CFLAGS) -c get_line.c

Build echoto

The command that builds fdisk.exe will fail with "Arguments list too long" error. The workaround is to put its arguments in a temp file. To create the temp file, we need an echoto program.

Create C:\fdisk_build\echoto\echoto.c:

#include <stdio.h>

int main(int argc, char *argv[])
    FILE *file;
    char* fileName;
    int i;

    if (argc <= 1)
        return 0;

    fileName = argv[1];

    file = fopen(fileName, "a");

    if (file == NULL) {
        return 1;

    for (i = 2; i < argc; i++)
        fprintf(file, "%s ", argv[i]);


    return 0;

In the command console, run

cd C:\fdisk_build\echoto

SET PATH=%PATH%;C:\fdisk_build\turbocpp\bin

tcc -IC:\fdisk_build\turbocpp\INCLUDE -LC:\fdisk_build\turbocpp\LIB echoto.c

The result file is C:\fdisk_build\echoto\echoto.exe.

Copy C:\fdisk_build\echoto\echoto.exe to C:\fdisk_build\fdisk\SOURCE\FDISK\echoto.exe.

Edit C:\fdisk_build\fdisk\SOURCE\FDISK\MAKEFILE, change

fdisk.exe: main.obj $(OBJ)  
 $(CC) $(LDFLAGS) -efdisk $(OBJ) $(LDLIBS)


fdisk.exe: main.obj $(OBJ)
 $(RM) objs_list.txt
 echoto.exe objs_list.txt $(OBJ1)
 echoto.exe objs_list.txt $(OBJ2)
 echoto.exe objs_list.txt $(OBJ3)
 $(CC) $(LDFLAGS) -efdisk $(LDLIBS) @objs_list.txt

Build fdisk

In the command console, run

cd C:\fdisk_build\fdisk\SOURCE\FDISK

C:\fdisk_build\nasm\nasm.exe -f obj bootnorm.asm

C:\fdisk_build\nasm\nasm.exe -f obj booteasy.asm

SET PATH=%PATH%;C:\fdisk_build\turbocpp\bin

make all

The result file is C:\fdisk_build\fdisk\SOURCE\FDISK\fdisk.exe.


Reply to: