diff --git a/src/base/init/lexer.l b/src/base/init/lexer.l index 32e34bf108..6072075175 100644 --- a/src/base/init/lexer.l +++ b/src/base/init/lexer.l @@ -395,6 +395,7 @@ threeinch_2880 RETURN(THREEINCH_2880); threeinch_720 RETURN(THREEINCH_720); fiveinch RETURN(FIVEINCH); fiveinch_360 RETURN(FIVEINCH_360); +customdiskette RETURN(CUSTOMDISKETTE); boot RETURN(BOOT); sectors RETURN(SECTORS); cylinders RETURN(CYLINDERS); diff --git a/src/base/init/parser.y b/src/base/init/parser.y index 1f2eaac92e..f120ff1699 100644 --- a/src/base/init/parser.y +++ b/src/base/init/parser.y @@ -291,7 +291,7 @@ enum { %token L_PARTITION WHOLEDISK %token SECTORS CYLINDERS TRACKS HEADS OFFSET HDIMAGE HDTYPE1 HDTYPE2 HDTYPE9 DISKCYL4096 /* floppy */ -%token THREEINCH THREEINCH_720 THREEINCH_2880 FIVEINCH FIVEINCH_360 READONLY BOOT +%token THREEINCH THREEINCH_720 THREEINCH_2880 FIVEINCH FIVEINCH_360 READONLY BOOT CUSTOMDISKETTE %token DEFAULT_DRIVES SKIP_DRIVES /* ports/io */ %token RDONLY WRONLY RDWR ORMASK ANDMASK RANGE FAST SLOW @@ -1500,6 +1500,12 @@ floppy_flag : READONLY { dptr->wantrdonly = 1; } | THREEINCH_720 { dptr->default_cmos = THREE_INCH_720KFLOP; } | FIVEINCH { dptr->default_cmos = FIVE_INCH_FLOPPY; } | FIVEINCH_360 { dptr->default_cmos = FIVE_INCH_360KFLOP; } + | CUSTOMDISKETTE { dptr->default_cmos = CUSTOM_DISKETTE; } + | SECTORS expression { dptr->sectors = $2; } + | CYLINDERS expression { dptr->tracks = $2; } + | TRACKS expression { dptr->tracks = $2; } + | HEADS expression { dptr->heads = $2; } + | OFFSET expression { dptr->header = $2; } | BOOT { dptr->boot = 1; } | L_FLOPPY string_expr { diff --git a/src/base/misc/disks.c b/src/base/misc/disks.c index 300e1b9a28..bf3f6a2d0e 100644 --- a/src/base/misc/disks.c +++ b/src/base/misc/disks.c @@ -510,7 +510,8 @@ static void image_auto(struct disk *dp) leavedos(19); return; } - if (!(set_floppy_chs_by_size(st.st_size, dp) || + if (!(dp->default_cmos == CUSTOM_DISKETTE || + set_floppy_chs_by_size(st.st_size, dp) || set_floppy_chs_by_type(dp->default_cmos, dp)) ){ d_printf("IMAGE auto set floppy geometry %s\n", dp->dev_name); leavedos(19); @@ -685,7 +686,8 @@ static void floppy_setup(struct disk *dp) static void dir_auto(struct disk *dp) { if (dp->floppy) { - if (!set_floppy_chs_by_type(dp->default_cmos, dp)) + if (!(dp->default_cmos == CUSTOM_DISKETTE || + set_floppy_chs_by_type(dp->default_cmos, dp))) d_printf("DIR: Invalid floppy disk type (%d)\n", dp->default_cmos); else d_printf("DIR: Selected floppy disk type (%s)\n", diff --git a/src/include/disks.h b/src/include/disks.h index f183a427a9..c4a2d54d19 100644 --- a/src/include/disks.h +++ b/src/include/disks.h @@ -94,6 +94,7 @@ typedef enum { THREE_INCH_720KFLOP, /* 3.5 in, 720 kB floppy */ THREE_INCH_FLOPPY, /* 3.5 in, 1.44 MB floppy */ THREE_INCH_2880KFLOP, /* 3.5 in, 2.88 MB floppy */ + CUSTOM_DISKETTE, } floppy_t; const char *floppy_t_str(floppy_t t);